第46课.继承中的构造与析构

时间:2019-11-28
本文章向大家介绍第46课.继承中的构造与析构,主要包括第46课.继承中的构造与析构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.子类对象的构造

a.子类中可以定义构造函数
b.子类构造函数
必须对继承而来的成员进行初始化
 1).直接通过初始化列表或者赋值进行初始化
 2).调用父类构造函数进行初始化

1).直接通过初始化列表或者赋值进行初始化

不可行,子类无法访问父类中的private成员。所以对这部分成员无法初始化

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

默认调用

 适用于无参构造函数和使用默认参数的构造函数

显示调用

 通过初始化列表进行调用;使用于所有父类构造函数;

class Child : public Parent
{
public:
    Child()            /*    隐式调用    */
    {
        cout << "Child() : " << endl;
    }
    Child(string s) : Parent("Parameter to Parent")        /*    显示调用    */
    {
        cout << "child() : " << s <<endl;
    }
}

2.子类对象的构造规则

a.子类对象在创建时会首先调用父类的构造函数
b.先执行父类构造函数再执行子类的构造函数
c.父类构造函数可以被隐式调用或者显示调用

3.对象创建时构造函数的调用顺序

a.调用父类的构造函数
b.调用成员变量的构造函数
c.调用类自身的构造函数

总结:先父母,后客人,再自己

eg:

#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 << "Child (string s) :" << s << endl;
    }
};

int main()
{
    Child c;
    Child cc("cc");
    
    return 0;
}

4.析构函数的调用顺序与构造函数相反

a.执行自身的析构函数
b.执行成员变量的析构函数
c.执行父类的析构函数

eg:

#include <iostream>
#include <string>

using namespace std;

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

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

class Child : public Parent
{
    Object mO1;
    Object mO2;
    string ms;
public:
    Child () : mO1("Default 1"), mO2("Default 2")
    {
        cout << "Child ()" << endl;
        ms = "Default";
    }
    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;
 
    /* Object (string s) : cc
     * Parent (string s) : cc
     * Object (string s) : cc 1
     * Object (string s) : cc 2
     * Child (string s)  : cc
     *
     * ~Child () : cc
     * ~Object() : cc 2
     * ~Object() : cc 1
     * ~Parent () : cc
     * ~Object() : cc
     */
       
    return 0;
}

原文地址:https://www.cnblogs.com/huangdengtao/p/11950319.html