首页 > 其他 > 详细

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

时间:2020-05-14 20:18:15      阅读:54      评论:0      收藏:0      [点我收藏+]

派生类对象在构造时,会首先调用基类的构造函数来构造对象中的基类成分,如果其构造函数中含有虚函数,则被调用的是基类的虚函数而不是派生类的。因为在构造基类成分时构造完成之前,派生类的成分尚未定义,此时虚函数绝不会下降到派生类层次,换句话说,此时刻的虚函数不像虚函数。

 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

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

原文:https://www.cnblogs.com/cs0915/p/12890637.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!