首页 > 代码库 > 第四十六课、继承中的构造与析构

第四十六课、继承中的构造与析构

一、子类对象的构造方法

1、子类中可以定义构造函数

2、子类构造函数:必须对继承来的成员进行初始化

(1)、直接通过初始化列表或者赋值方式进行初始化(但可能继承来的是private成员)

(2)、调用父类构造函数进行初始化

A、默认调用:适用于无参构造函数使用默认参数的构造函数

B、显示调用:通过初始化列表进行调用(适用于所有父类的构造函数)

技术分享

#include<iostream>
#include<string>

using namespace std;

class Parent
{
public:
    Parent()
    {
        cout << "Parent()" << endl;
    }

    Parent(string s)
    {
        cout << "Parent(string s):" << s << endl;
    }
};

class Child : public Parent
{
public:
    Child()//隐式调用父类构造函数,调用的是无参构造函数
    {
        cout << "Child()" << endl;
    }
    Child(string s) : Parent(s)//显示调用父类构造函数,若这里不显示调用,则会默认调用无参构造函数
    {
        cout << "Chind(string s):" << s << endl;
    }    
};

int main()
{
    Child c;//先输出Parent()再输出Child(), 说明先调用父类的构造函数
    Child cc("cc");//先输出Parent(string s):cc 再输出Child(string s):cc
    return 0;
}

 

二、子类对象的构造规则、构造顺序、析构顺序

1、构造规则

(1)、子类对象在构造时会首先调用父类对象的构造函数

(2)、先执行父类构造函数在执行子类构造函数

(3)、父类构造函数可以被隐式调用或者显示调用

 

2、构造顺序:先父母、后客人、再自己

(1)、调用父类的构造函数

(2)、调用成员变量的构造函数(与声明顺序相同

(3)、调用自身的构造函数

 

3、析构顺序:与构造函数相反

(1)、调用自身的构造函数

(2)、调用成员变量的构造函数

(3)、调用父类的构造函数

#include<iostream>
#include<string>

using namespace std;

class Object
{
    string ms;
public:
    Object(string s)
    {
        ms = s;
        cout << "Object(string s)" << s << endl;
    }

    ~Object()
    {
        cout << "~Object():" << ms << endl;
    }

};
class Parent : public Object
{
    string ms;
public:
    Parent(string s) : Object(s)
    {
        ms = s;
        cout << "Parent(string s):" << s << endl;
    }
    ~Parent()
    {
        cout << "~Parent():" << ms << endl;
    }
};

class Child : public Parent
{
    Object mO1;
    Object mO2;
    string ms;
public:
    Child(string s) : Parent(s), mO1(s + "1"), mO2(s + "2")
    {
        cout << "Child(string s):" << s << endl;
        ms = s;
    }    
    ~Child()
    {
        cout << "~Child()" << ms << endl;
    }
};

int main()
{
    Child cc("cc");//先父母、后客人、再自己
    cout << endl;
    return 0;
}

//输出结果
/*
Object(string s)cc
Parent(string s):cc
Object(string s)cc1
Object(string s)cc2
Child(string s):cc

~Child()cc
~Object():cc2
~Object():cc1
~Parent():cc
~Object():cc
*/

 

 三、小结

1、子类对象在创建时需要调用父类对象的构造函数进行初始化

2、先执行父类构造函数然后执行成员构造函数

3、父类构造函数显示的调用要在初始化列表出

4、子类对象在销毁时需要调用父类对象的析构函数进行清理

5、析构顺序与构造顺序对称相反

 

第四十六课、继承中的构造与析构