继承中的构造与析构
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;
}
顺序和构造函数相反
小结
以上是关于继承中的构造与析构的主要内容,如果未能解决你的问题,请参考以下文章