在网上偶然看到关于父类和子类构造函数的一些注意和使用,自己想了想。记录一下。
我们知道 在生成子类对象的时候,一定是会调用父类的构造函数。那么问题来了。如下:
问题:子类在进行构造的时候,调用什么形式的父类构造,以及何时调用呢?
先说子类在构造的时候调用什么形式的父类吧。直接pou一张图吧
右边的三种情况,看图很明白了。说一下右边父类仅有有参构造,子类的调用方法,在下面的代码中做了演示。
说下左边吧,当子类中有了有参构造,你又不想自行显式的调用,那就加上一个无参构造,让编译器自己去调用这个无参构造。
不多说,直接看段代码。 我只在两个地方写了注释,需要的仔细读读那几句注释。
#include
#include
using namespace std;
class Animal
{
public:
string name;
int age;
Animal(){
cout << "调用父类无参构造" << endl;
}
Animal(string m_name , int m_age)
{
this->name = m_name;
this->age = m_age;
cout << "调用父类有参构造" << endl;
}
};
class Son1: public Animal
{
public:
// 本程序由于父类有了无参构造,所以不显式的调用父类有参构造。子类就自己调用父类无参构造了
Son1(string m_name,int m_age )
{
this->name = m_name;
this->age = m_age;
cout << "调用Son1子类构造" << endl;
}
void show()
{
cout << "第一个儿子" << endl;
cout << this->name << '\t' << this->age << endl;
}
};
class Son2: public Animal
{
public:
double data;
// 子类显示调用父类有参构造。
// 如果你的父类中没有自己写的无参构造,一定要这样写。自行对比上面的 子类 Son1
Son2( string m_name , int m_age , double m_data):Animal( m_name , m_age)
{
this->name = m_name;
this->age = m_age;
this->data = m_data;
cout << "调用Son2子类构造" << endl;
}
void show()
{
cout << "第二个儿子" << endl;
cout << this->name << '\t' << this->age << '\t' << this->data << endl;
}
};
void test01()
{
Son1 son("石头",30);
son.show();
}
void test02()
{
Son2 son("悟空" , 18 , 188.89);
son.show();
}
void main()
{
test01();
test02();
}
看下输出结果吧:
调用父类无参构造
调用Son1子类构造
第一个儿子
石头 30
调用父类有参构造
调用Son2子类构造
第二个儿子
悟空 18 188.89
只说构造的结果输出: 父类无参构造构造--->Son1子类构造 ----------父类有参构造---->Son2子类构造
作者:如果你觉得有用,记得给我点个赞哦!多谢支持!!!