none
pure virtual function call 怎么解决,完全搞不明白了 RRS feed

  • 问题

  • 用打日志的方式大概定位到了问题 但是很奇怪的一点让我又有点怀疑了,调用了一个纯虚函数,在出现这个错误的时候,纯虚函数上面的日志刚好打印 就出现这个错误了,这个纯虚函数实现的地方我都有加日志,但是没有任何打印,也就是好像调用这个函数就出这个问题了

    现在让我不大确定是不是这个问题引起的了

    请问怎么解决啊? 怎么调试啊,太难调试了。。。悲剧死了,这个错误 跑DEBUG 都没作用,定位不到堆栈信息


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2012年11月1日 15:35

答案

  • 请问你的问题解决了吗?调试的结果如何?

    如果你怀疑是某个函数的调用过程导致了这个错误,你可以对这个函数进行单步调试。

    以下资料供你参考:

    一篇对pure virtual function call介绍得很全面的文章,从纯虚函数抽象基类讲起,介绍了对象模型中vptr及vtable的概念以及他们的构造析构过程(英文):http://www.artima.com/cppsource/pure_virtual.html

    这篇是对于上面那篇文章的总结概括:http://www.kuqin.com/language/20100307/80980.html

    希望对你有帮助,谢谢。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 dowflyon 2012年11月10日 19:47
    2012年11月5日 7:23
    版主
  • 在代码里特意调用纯虚函数编译器不会给你编译通过的。运行时出现纯虚函数调用说明你执行的不是编译器产生的代码,比如程序里有缓冲区溢出bug造成执行到数据了。


    Visual C++ MVP

    • 已标记为答案 dowflyon 2012年11月10日 19:47
    2012年11月9日 0:19
    版主
  • 大体讲,子类继承父类,在子类中就有一份父类虚函数的拷贝,通过类的构造函数,产生指向虚表的指针,通过柝构函重置指针。只有重写纯虚函数才能产生子类的对象,也就是只有产生子类的对象才能产生指向虚表的指针。

    xiao

    • 已标记为答案 dowflyon 2012年11月10日 19:47
    2012年11月10日 0:33

全部回复

  • 你好,

    我有点看不明白你的描述。你想要调试什么?是想执行纯虚函数的函数体中的语句吗?这是不可行的。

    纯虚函数在基类中一般不做实现,只是声明了一个操作名,提供给派生类进行重载。

    如果你在基类中实现了纯虚函数,编译器不会报错,这一点我用Visual Studio测试过。但是纯虚函数是永远不会被调用的,你尝试调用他的时候编译器就会报错。可想而知,纯虚函数的函数体是永远不会被执行。

    如果我误解了你的意思,请告知。谢谢!


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    2012年11月2日 7:31
    版主
  • 恩,纯虚函数调用就是出这个问题,本来按照我们希望的结果是不会被调用。。。


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2012年11月2日 12:15
  • 请问你的问题解决了吗?调试的结果如何?

    如果你怀疑是某个函数的调用过程导致了这个错误,你可以对这个函数进行单步调试。

    以下资料供你参考:

    一篇对pure virtual function call介绍得很全面的文章,从纯虚函数抽象基类讲起,介绍了对象模型中vptr及vtable的概念以及他们的构造析构过程(英文):http://www.artima.com/cppsource/pure_virtual.html

    这篇是对于上面那篇文章的总结概括:http://www.kuqin.com/language/20100307/80980.html

    希望对你有帮助,谢谢。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 dowflyon 2012年11月10日 19:47
    2012年11月5日 7:23
    版主
  • 纯虚函数,  就是这样定义的函数  virtual  void   fun() = 0;

    纯虚函数必需在子类中重写, 否则不能产生子类的对象。


    xiao

    2012年11月5日 12:08
  • 在代码里特意调用纯虚函数编译器不会给你编译通过的。运行时出现纯虚函数调用说明你执行的不是编译器产生的代码,比如程序里有缓冲区溢出bug造成执行到数据了。


    Visual C++ MVP

    • 已标记为答案 dowflyon 2012年11月10日 19:47
    2012年11月9日 0:19
    版主
  • 大体讲,子类继承父类,在子类中就有一份父类虚函数的拷贝,通过类的构造函数,产生指向虚表的指针,通过柝构函重置指针。只有重写纯虚函数才能产生子类的对象,也就是只有产生子类的对象才能产生指向虚表的指针。

    xiao

    • 已标记为答案 dowflyon 2012年11月10日 19:47
    2012年11月10日 0:33