经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
一个纯虚函数导致的问题
来源:cnblogs  作者:小船1968  时间:2018/11/13 9:44:21  对本文有异议

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中,程序编译就通不过,将纯虚函数改变为虚函数时,才能通过。

各位高手,你们认为呢?

 

  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号