继承中的构造与析构

Posted 学习只为旅行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承中的构造与析构相关的知识,希望对你有一定的参考价值。






调用Child午餐构造函数,Child继承自Parent,创建对象c时,会调用父类无参构造函数,而父类没有无参构造函数,所以报错:
no Parent constructor to call:

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


先调用爸爸的构造函数,再自己的构造函数!

如果把显式调用注释掉,结果如下:




报错,因为定义对象cc时,先初始化成员对象mO1,mO2,但是没有Object类没有无参构造函数,所以需要显式调用(初始化列表),取消注释后输出:

分析:先父母,后客人,再自己
cc的父母是Parent,调用Parent构造函数之前发现Parent的父类是Object,所以最先调用Object构造函数,再Parent构造函数。紧接着是客人的构造函数(mO1、mO2),最后是Chile自己

#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;
    
    return 0;
}


顺序和构造函数相反

小结

以上是关于继承中的构造与析构的主要内容,如果未能解决你的问题,请参考以下文章

C++--继承中的构造与析构父子间的冲突

继承中的构造与析构

继承中的构造与析构(三十九)

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

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

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