之前的两篇文章,我们已经了解了C++中继承的一些基本知识,也探索了初始化派生类的次序。本文主要是更深入的了解构造函数所扮演的角色(初始化一个派生类时)。我们继续沿用上篇文章的例子。
class Base
{
public:
int m_nValue;
Base(int nValue=0)
: m_nValue(nValue)
{
}
};
class Derived: public Base
{
public:
double m_dValue;
Derived(double dValue=0.0)
: m_dValue(dValue)
{
}
};
初始化非派生类时,构造函数只需要关心它自己的成员。例如,
int main()
{
Base cBase(5); // use Base(int) constructor
return 0;
}
当cBase被实例化时,发生如下事件:
1.为cBase预留内存
2.合适的Base构造函数被调用
3.初始化列表对变量进行初始化
4.执行构造函数的函数体
5.从调用出返回
这个过程非常的直观。但是换成初始化一个派生类时,事情变得稍微复杂点:
int main()
{
Derived cDerived(1.3); // use Derived(double) constructor
return 0;
}
当cDerived被实例化时,发生了如下事情:
1.为cDerived预留足够的内存(包括Base部分以及Derived部分)
2.合适的派生类构造函数被调用
3.Base对象被首先构造通过合适的Base构造函数
4.初始化列表对变量进行初始化
5.执行构造函数的函数体