欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一个纯虚函数导致的问题

程序员文章站 2022-05-06 10:33:46
WIN7系统,VC2010下。 程序A静态链接B.dll动态库。 B.dll中导出3个类: (1) 基类 class AFX_EXT_CLASS base { public: base(){}; virtual ~base(){}; virtual int getX() = 0; protected ......

win7系统,vc2010下。

程序a静态链接b.dll动态库。

b.dll中导出3个类:

(1) 基类

class afx_ext_class base

{

public:

  base(){};

  virtual ~base(){};

  virtual int getx() = 0;

protected:

  int x;

  ......

}

(2)子类1

class afx_ext_class derived_1

{

public:

  derived_1(){};

  virtual ~derived_1(){};

  int getx() {return x;};

protected:

  //int x; x是继承的

  ......

}

(2)子类2

class afx_ext_class derived_2

{

public:

  derived_2(){};

  virtual ~derived_2(){};

  int getx() {return x;};

protected:

  //int x; x是继承的

  ......

}

函数getx()是为了防止父类实例化而设为纯虚函数。

在程序a中引用该dll,一切都是按规矩来的(头文件包含,引入lib文件)

a中引用 dll中的类:

class a 

{  

  base* pbase;

  void oncreateobject(int type)

  {

    if(type == 0)

      pbase = new derived_1();

    else

      pbase = new derived_2();

  }

  。。。。。。

} 

a程序将oncreateobject与一个菜单命令连接起来,即此函数不是在系统初始化时调用。

编译通过。但在运行中,出现了问题,系统在加载dll过程中意外退出。

通过思考,将base函数中的纯虚函数改变为:

int getx() {return x;};

而将两个子类中的同名函数删除,运行正常。

但问题在哪里? 为什么 ?

可能的原因:

   该dll在另一个dll中也被引用,是base的指针形式,引用是通过值传入,并没有new实例,但可能是因为这个才导致程序不能进入吧?

  在win10的vc2010中,程序编译就通不过,将纯虚函数改变为虚函数时,才能通过。

各位高手,你们认为呢?