绝不在构造函数和析构函数中调用虚函数
Posted cs0915
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绝不在构造函数和析构函数中调用虚函数相关的知识,希望对你有一定的参考价值。
派生类对象在构造时,会首先调用基类的构造函数来构造对象中的基类成分,如果其构造函数中含有虚函数,则被调用的是基类的虚函数而不是派生类的。因为在构造基类成分时构造完成之前,派生类的成分尚未定义,此时虚函数绝不会下降到派生类层次,换句话说,此时刻的虚函数不像虚函数。
1 #include<iostream> 2 using namespace std; 3 4 class Base 5 { 6 public: 7 Base() 8 { 9 Fuction(); 10 } 11 12 virtual void Fuction() 13 { 14 cout << "Base::Fuction" << endl; 15 } 16 }; 17 18 class A : public Base 19 { 20 public: 21 A() 22 { 23 Fuction(); 24 } 25 26 virtual void Fuction() 27 { 28 cout << "A::Fuction" << endl; 29 } 30 }; 31 32 // 这样定义一个A的对象,会输出什么? 33 int main() 34 { 35 A a; 36 }
输出:
Base::Fuction
A::Fuction
同样在析构函数中,派生类的析构函数首先被调用把对象中的派生类成分析构掉,再调用基类的析构函数,如果析构函数中调用了虚函数,则因为派生类成分已经呈现未定值,C++视它们彷佛不存在,进入基类析构函数后对象就称为了一个基类对象,调用的就是基类的虚函数了。
#include <iostream> using namespace std; class A{ public: virtual void show(){ cout<<"in A"<<endl; } virtual ~A(){show();} }; class B:public A{ public: void show(){ cout<<"in B"<<endl; } }; int main(){ A a; B b; }
输出:
in A
in A
以上是关于绝不在构造函数和析构函数中调用虚函数的主要内容,如果未能解决你的问题,请参考以下文章