但是继承类构造对象时就有点复杂了:
int main()构造子类对象时具体c++具体做了:
{
Derived cDerived(1.3); // use Derived(double) constructor
return 0;
}
- 为子类对象cDerived 分配内存(为父类和子类分配足够的内存)
- 调用合适的子类构造函数
- 先用合适的基类构造函数构造基类对象
- 初始化列表对成员函数进行初始化
- 执行构造函数
- 返回
记住很重要的一点事:构造子类时,基类构造函数先要被调用(调用无参数的默认构造函数),在此之前子类构造函数什么都不能做。
初始化基类成员函数
我们的子类这样定义有一个很大的弊端就是不能初始化继承来的m_nValue变量。如果在构造子类对象时,想同时设置子类变量m_dValue和父类变量m_nValue的值,该怎么办呢?
c++新手可以这么设计子类:
但是,c++不运行在子类构造函数的初始化成员列表中对父类的成员变量进行初始化。换句话说,初始化成员列表只能初始化本类的成员变量。
为什么c++这么规定呢?原因是要考虑到const变量和reference变量。如果变量m_nValue是const,赋值不可改变,该变量在定义的时候就必须初始化。父类对m_nValue定义是赋值,而子类构造函数再去对它初始化,那么这个const变量就有可能会别改变。为了防止这种情况的发生,c++才作此规定。
那么怎么才能在构造子类对象时合适地对继承来的变量m_nValue赋值呢?
可用在子类的构造函数的初始化成员列表中调用父类的构造函数。
现在:
int main()
{
Derived cDerived(1.3, 5); // use Derived(double) constructor
return 0;
}
执行细节:
- 为子类对象cDerived分配内存
- 调用子类构造函数,发现有dValue = 1.3, nValue = 5
- 编译器查找基类是否有特殊的构造函数,有!那就掉用参数nValue = 5的构造函数Base(int)
- 基类初始化参数列表将基类成员变量m_nValue 设置为 5
- 执行基类构造函数体
- 基类构造函数返回
- 子类参数化列表设置成员变量m_dValue 为 1.3
- 执行子类构造函数体
- 子类构造函数返回