读书人

C++虚函数和纯虚函数相关,该如何处理

发布时间: 2012-03-24 14:00:46 作者: rapoo

C++虚函数和纯虚函数相关
下面这段代码在调用基类虚构函数的时候出现运行时错误,问题发生在函数test2(),第一次调用函数test2()的时候没问题,第二次通过test()调用就出现运行时错误,请大家帮忙看下什么原因。
备注:先不要管在析构函数中调纯虚函数这种做法是不对的问题,请重点关注下为什么test2()调用结果不一样

编译器:
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C/C++ code
#include <iostream>using namespace std;class PureVirtualBase{public:    void virtual test();    void virtual test2()=0;    void virtual test3()=0;    virtual ~PureVirtualBase()=0;};PureVirtualBase::~PureVirtualBase(){    cout << "PureVirtualBase destructor." << endl;    test3();    test2();    test();}void PureVirtualBase::test(){    test2();}void PureVirtualBase::test2(){    cout << "base test2" << endl;}void PureVirtualBase::test3(){    cout << "base test3" << endl;}class PureVirtualChild:public PureVirtualBase{public:    void test2();    void test3();    ~PureVirtualChild();};PureVirtualChild::~PureVirtualChild(){    cout << "PureVirtualChild destructor." << endl;}void PureVirtualChild::test2(){    cout << "child test2" << endl;}void PureVirtualChild::test3(){    cout << "child test3" << endl;}int main(){    PureVirtualBase *base = new PureVirtualChild();    base->test();    delete base;    int temp;    cin >> temp;    return 0;}


[解决办法]
PureVirtualBase::~PureVirtualBase( ) 里调用的是PureVirtualBase的函数,不经过需函数表
void PureVirtualBase::test() 使用虚函数表来调用函数,而这时虚函数表指针已经复原了,所以挂了


[解决办法]
C/C++ code
    typedef struct    {        const struct        {            void *lpfnMethods[1];        } FAR *lpVtbl;    } ICInterface;
[解决办法]
探讨

C/C++ code

PureVirtualBase::~PureVirtualBase( ) 里调用的是PureVirtualBase的函数,不经过需函数表
void PureVirtualBase::test() 使用虚函数表来调用函数,而这时虚函数表指针已经复原了,所以挂了



如果把void virtual test2()=0;重新定义成void virtual test2()……

[解决办法]
C/C++ code
    PureVirtualBase()    {        test3();        test2();        test();   // 一样会有问题, (这与test()是不是虚的无关)    } 

读书人网 >C++

热点推荐