• 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;
    }

    运行结果:

    穷则独善其身,达则兼济天下……
  • 相关阅读:
    如何使用 Python 進行字串格式化
    骨牌摆放问题 POJ 2411(状态压缩DP)
    ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
    Windows 系统如何完全卸载 VSCode
    Python 在VSCode中使用
    第十一场训练赛
    L1-046 整除光棍 (20分)
    Problem 330A
    POJ 2187 Beauty Contest (凸包 旋转卡壳)
    程序员:写作能收获什么?
  • 原文地址:https://www.cnblogs.com/hmy-666/p/14414836.html
Copyright © 2020-2023  润新知