为什么说析构函数里面不要调虚函数?
Effective C++里面说道"析构函数里面不要调虚函数",但是书里面举的例子是构造函数里面不要调虚函数,并没有举析构函数的例子啊。
这样做会有什么风险吗? 请举例提示! 谢谢
[解决办法]
在继承层次中,先析构派生类。
[解决办法]
先析构派生类,然后析构基类的时候,析构函数里面有个虚函数,虚函数表的地址是派生类的某个函数,这时候派生类都已经析构了。。
[解决办法]
基本上就像楼上说的,再基类中调用的虚函数不是子类的,而是基类本身的。在析构的时候,虚函数会变成类似non-virtual的效果。当然你知道了这结果,然后你故意把他当作non-virtual的版本去使用,理论上不会算错,但是virtual这个词会造成歧义性,对维护的人来说会带来困扰。参考代码如下:
class A{
public:
virtual void display()=0;
void f(){
display();//这里调用的是子类的没问题吧
}
virtual ~A(){
display();//但这里调用的是基类的,如果你实现了虚函数仍然可以运行,但会有歧义
//如果没有实现,直接就报错了
//这样不如直接用non-virtual函数
}
};
class B:public A{
public:
virtual void display(){
cout<<"B"<<endl;
}
};
int main(){
B *p=new B;
p->f();
delete p;
}
virtual void display()=0{
cout<<"A"<<endl;
}
先析构派生类,然后析构基类的时候,析构函数里面有个虚函数,虚函数表的地址是派生类的某个函数,这时候派生类都已经析构了。。
你说的这个"析构函数里面有个虚函数,虚函数表的地址是派生类的某个函数",我觉得实际编码做不到。
基类如果有一个纯虚函数=0,那么在基类的析构函数里面根本就不能调它,因为没有函数的实现体。
你能举出一个代码的例子吗?