C++ | 构建子类,初始化父类(构造函数和析构函数的执行顺序)

本文深入探讨了C++中构造函数与析构函数的调用顺序,通过具体实例演示了在子类对象创建和销毁时,如何首先调用父类的构造函数进行初始化,然后调用子类构造函数;在对象销毁时,则先调用子类的析构函数,后调用父类析构函数的过程。

构造函数顺序

假如有一个父类A(基类),一个的子类B,公有继承于A,当在测试文件(main函数)里,定义一个子类对象d,d对象的初始化会调用d的构造函数,但d对象的构造函数要想完成初始化必须先初始化父类的,因为子类B继承于A,A类的成员函数都被B继承过去了,所以完成初始化子类对象d必须先调用A(父类)的构造函数。

析构函数顺序

析构函数调用顺序其实和的原理类似,都是是先进后出原则,当创建子对象d时,会先执行父类构造函数,然后执行子类的构造函数。最后函数结束释放内存的时候,就会先执行子类的析构函数,然后才是父类的。

class Base1 {
public:

    Base1(){
        cout << "调用了Base的默认构造函数" << endl;
    }

    Base1(int b ,int d)  {
        cout << "调用了带两个参数的Base的构造函数" << endl;
    }

    Base1(int b)  {
        cout << "调用了带一个参数的Base的构造函数" << endl;
    }

    ~Base1() {
        cout << "调用了Base的析构函数" << endl;
    }
};

class Derived1 :public Base1{
public:

    Derived1()  {
        cout << "调用了Derived1的默认构造函数" << endl;
    }


    Derived1(int b, int d)  {
        cout << "调用了带两个参数的Derived1构造函数" << endl;
    };

    ~Derived1() {
        cout << "调用了Derived1的析构函数" << endl;

    }
};

    int main()

{

    Base1 b1;
    Base1 b2(10);
    Base1 b3(10,20);


    cout<<"==========="<<endl;

    Derived1 d1;

    Derived1 d2(1,2);


    cout<<"================="<<endl;

    return 0;
}

运行结果:
运行结果

总结:

构造子类时,先执行父类的构造函数,然后执行子类的构造函数。

析构子类时,先执行子类的析构函数,然后执行父类的析构函数。

### C++父类子类构造函数析构函数的调用顺序及机制 在C++中,当涉及到继承时,构造函数析构函数的调用顺序遵循特定的规则。这些规则确保对象的初始化销毁过程能够正确地完成。 #### 构造函数的调用顺序 在创建一个派生类(子类)的对象时,构造函数的调用顺序是: 1. 首先调用基类(父类)的构造函数[^1]。 2. 然后依次调用派生类(子类)的构造函数[^1]。 这种顺序保证了基类的部分在派生类之前被正确初始化。例如,在以下代码中: ```cpp class Base { public: Base() { std::cout << "Base Constructor" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived Constructor" << std::endl; } }; int main() { Derived d; return 0; } ``` 输出结果将是: ``` Base Constructor Derived Constructor ``` #### 析构函数的调用顺序 析构函数的调用顺序构造函数相反,即: 1. 首先调用派生类(子类)的析构函数[^1]。 2. 然后调用基类(父类)的析构函数。 这种顺序确保派生类部分在基类部分之前被销毁。例如,在以下代码中: ```cpp class Base { public: ~Base() { std::cout << "Base Destructor" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived Destructor" << std::endl; } }; int main() { Derived d; return 0; } ``` 输出结果将是: ``` Derived Destructor Base Destructor ``` #### 使用父类指针指向子类对象的情况 当使用父类指针指向子类对象时,构造函数析构函数的调用顺序仍然遵循上述规则。例如: ```cpp class Base { public: Base() { std::cout << "Base Constructor" << std::endl; } virtual ~Base() { std::cout << "Base Destructor" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived Constructor" << std::endl; } ~Derived() { std::cout << "Derived Destructor" << std::endl; } }; int main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值