绝不在构造函数和析构函数中调用虚函数

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

以上是关于绝不在构造函数和析构函数中调用虚函数的主要内容,如果未能解决你的问题,请参考以下文章

条款09:绝不在构造和析构过程中调用virtual函数

条款9:绝不在构造和析构过程中调用virtual函数

条款9:绝不在构造和析构过程中调用virtual函数

NO.8:绝不在构造或者析构过程中调用virtual函数

构造函数和析构函数中的虚函数调用[重复]

构造函数和析构函数