码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-14 19:36:51      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:类对象   on()   输出   bsp   out   析构   str   using   show   

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

 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

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

标签:类对象   on()   输出   bsp   out   析构   str   using   show   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!