C++构造函数和析构函数调用虚函数时都不会使用动态联编

先看一个例子:

#include <iostream> using namespace std; class A{ public: A() { show(); } virtual void show(){ cout<<"in A"<<endl; } virtual ~A(){ show(); } }; class B:public A{ public: B() { show(); } void show(){ cout<<"in B"<<endl; } }; int main(){ A *a = new A; delete a; cout << "*****************" << endl; A *b = new B; delete b; }

输出结果,可以看到没有预想的多态效果:

in A
in A
*****************
in A
in B
in A

 

结论:构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。

原因分析:

(1)不要在构造函数中调用虚函数的原因:因为父类对象会在子类之前进行构造,此时子类部分的数据成员还未初始化, 因此调用子类的虚函数是不安全的,故而C++不会进行动态联编。
(2)不要在析构函数中调用虚函数的原因:析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数。所以在调用基类的析构函数时,派生类对象的数据成员已经“销毁”,这个时再调用子类的虚函数已经没有意义了

posted @ 2016-08-31 15:45  bonelee  阅读(6950)  评论(1编辑  收藏  举报