C++构造函数的调用顺序

在面试的时候经常提问的一个问题是,一个类继承自另一个类,构造函数的调用顺序是什么样的,这里直接写个demo验证一下:

代码

// 来验证一下调用构造函数的顺序
#include <iostream>

using namespace std;

class base
{
public:
    base()
    {
        cout << "调用基类的构造函数" << endl;
    }
    virtual ~base() 
    {
        cout << "调用基类的析构函数" << endl;
    }
};

class B
{
public:
    B()
    {
        cout << "调用class B的构造函数" << endl;
    }
    ~B()
    {
        cout << "调用class B的析构函数" << endl;
    }
};

class A : public base
{
public:
    A()
    {
        cout << "调用class A的构造函数" << endl;
    }
    ~A()
    {
        cout << "调用class A的析构函数" << endl;
    }

private:
    B b;
};

int main()
{
    base *a = new A();
    delete a;
    return 0;
}

程序输出

调用基类的构造函数
调用class B的构造函数
调用class A的构造函数
调用class A的析构函数
调用class B的析构函数
调用基类的析构函数

结论

  1. 调用基类的构造函数
  2. 调用类内成员对象的构造函数
  3. 调用派生类的构造函数
  4. 调用派生类的析构函数
  5. 调用类内成员对象的析构函数
  6. 调用基类的析构函数

注意

基类的析构函数应该用virtual修饰,不然的话程序输出如下,也就是说派生类的析构函数是没有被调用的。同样的派生类中的成员对象也没有被析构。
这种问题出现在删除指向派生类的基类指针的时候,如果我们改成
A*a = new A();
delete a;
则能够正常的析构。

调用基类的构造函数
调用class B的构造函数
调用class A的构造函数
调用基类的析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值