类与类之间除了横向的组合、关联、依赖和聚合外,还有着纵向的【继承】关系,被继承的类被称作“父类”,继承了父类成员变量和方法的类则被称作子类。
假设现在有这样的两个类,一个叫Zero,另一个叫Gemini,二者关系如下,Zero类是Gemini类的父类,两个类中都包含构造和析构函数,Zero比Gemini多一个成员变量zero。
根据所显示类图,可以编译得到如下代码。
#include<iostream>
using namespace std;
class Zero
{
public:
int zero;
Zero()
{
cout << "Zero" << endl;
}
public:
~Zero()
{
cout << "~Zero" << endl;
}
};
class Gemini :public Zero
{
public:
Gemini()
{
cout << "Gemini" << endl;
}
public:
~Gemini()
{
cout << "~Gemini" << endl;
}
};
int main()
{
Gemini alpha;
cout << alpha.zero << endl;
cout << endl;
return 0;
}
由于并没有给alpha赋值,alpha中存储的是一个垃圾数。
根据运行结果,我们可以推断出,这段代码中函数执行的流程:
先创建一个Gemini类的对象alpha,在创建对象后直接调用类的构造函数。由于Gemini类为Zero类的子类,在调用Gemini的构造函数之前会自动创建一个Zero类的对象,其中包括了int类型的成员变量zero。因为并没有对zero进行初始化,所以zero中存储的是一串垃圾数并将这串垃圾数输出。
输出后的代码执行换行操作,留下一行空白,在“return 0”后执行析构函数将对象释放。
由于创建的alpha是Gemini类的对象,所以限制性Gemini的析构函数再执行Zero的析构函数。
倘若想要让zero的数值为有效值,只需要向Zero的构造函数中传递参数,并在Gemini类中用初始化列表为zero赋值即可。
#include<iostream>
using namespace std;
class Zero
{
public:
int zero;
Zero(int zero)
{
this->zero = zero;
cout << "Zero" << endl;
}
public:
~Zero()
{
cout << "~Zero" << endl;
}
};
class Gemini :public Zero
{
public:
Gemini(int zero) :Zero(zero)
{
cout << "Gemini" << endl;
}
public:
~Gemini()
{
cout << "~Gemini" << endl;
}
};
int main()
{
Gemini alpha(100);
cout << alpha.zero << endl;
cout << endl;
return 0;
}
所得结果如下。