C++继承中的父类与子类的构造与析构


子类继承父类后,当创建子类对象,也会调用父类的构造函数

 

问题:父类和子类的构造和析构顺序是谁先谁后?

 

class Base 
{
public:
    Base()
    {
        cout << "Base构造函数!" << endl;
    }
    ~Base()
    {
        cout << "Base析构函数!" << endl;
    }
};

class Son : public Base
{
public:
    Son()
    {
        cout << "Son构造函数!" << endl;
    }
    ~Son()
    {
        cout << "Son析构函数!" << endl;
    }

};


void test01()
{
    //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
    Son s;
}

int main() {

    test01();

    system("pause");

    return 0;
}

运行结果:

 

 总结:继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

重点:

父类构造函数的调用规则:
①. 如果子类没有定义构造函数,则调用父类的无参数的构造函数;
②. 如果子类定义了构造函数,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造函数,然后执行自己的构造函数;
③. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数;
④. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数;
⑤. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造函数,则子类必须显示调用此带参构造函数);

以上总结起来就两句话:
如果子类没有显示的调用父类的构造函数,那么默认会调用父类无参的构造函数!!!
如果父类只提供了有参数的构造函数,那么子类在默认情况下调用父类的无参构造函数时就会报错!(那么解决这个报错,需要给子类加上调用父类有参构造函数的通知即可)

报错:

 

#include <iostream>
using namespace std;

class Base 
{
public:
    Base(int argue)
    {
        cout << "我是Base有参构造函数!"<<argue << endl;
    }
    ~Base()
    {
        cout << "Base析构函数!" << endl;
    }
};

class Son : public Base
{
public:
    Son()//因为创建子类时系统默认调用父类无参构造函数,但是父类中只有有参构造函数,所以会报错
    {
        cout << "Son构造函数!" << endl;
    }
    ~Son()
    {
        cout << "Son析构函数!" << endl;
    }

};


void test01()
{
    //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
    Son s;
}

int main() {

    test01();

    //system("pause");

    return 0;
}

 

运行结果报错:

 

 

 

修改后:

 

class Base 
{
public:
    Base(int argue)
    {
        cout << "我是Base有参构造函数!"<<argue << endl;
    }
    ~Base()
    {
        cout << "Base析构函数!" << endl;
    }
};

class Son : public Base
{
public:
    Son():Base(666)//修改系统默认调用无参为有参
    {
        cout << "Son构造函数!" << endl;
    }
    ~Son()
    {
        cout << "Son析构函数!" << endl;
    }

};


void test01()
{
    //继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
    Son s;
}

int main() {

    test01();

    system("pause");

    return 0;
}

 

运行结果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM