lee-romantic 's Blog
Everything is OK!
Toggle navigation
lee-romantic 's Blog
主页
About Me
归档
标签
构造函数和析构函数中调用虚函数
2018-09-20 12:23:48
356
0
0
lee-romantic
##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;//输出"in A" delete a;//输出"in A" cout << "*******我是分割线**********" << endl; A *b = new B;//输出"in A"后,输出"in B" delete b;//输出"in B"后,再输出"in A" getchar(); return 0; } ``` 输出结果,可以看到没有预想的多态效果: ``` in A in A *******我是分割线********** in A in B in B in A ``` ***结论***:构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。 原因分析: (1)不要在构造函数中调用虚函数的原因:因为父类对象会在子类之前进行构造,此时子类部分的数据成员还未初始化, 因此调用子类的虚函数是不安全的,故而C++不会进行动态联编。 (2)不要在析构函数中调用虚函数的原因:析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数。所以在调用基类的析构函数时,派生类对象的数据成员已经“销毁”,这个时再调用子类的虚函数已经没有意义了。
上一篇:
何时需要自定义拷贝构造函数及其他(三法则)
下一篇:
指针赋值的理解
0
赞
356 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册