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() { test3(); test2(); test(); // 一样会有问题, (这与test()是不是虚的无关) }