C++开发中级
985 浏览 5 years, 10 months
3.1 父类构造函数
版权声明: 转载请注明出处 http://www.codingsoho.com/父类构造函数
对象并不是突然建立起来的,创建对象时必须同时创建父类以及包含于其中的对象。C++定义了如下的创建顺序:
(1)如果某个类具有基类,执行基类的默认构造函数。
(2)类的非静态数据成员按照声明的顺序创建。
(3)执行该类的构造函数。
可以递归使用这个规则。如果类具有祖先,祖先类在父类之前初始化,依此类推。下面的代码显示了创建顺序。我们通常建议不要在类定义中直接实现方法,而我们在下面的代码中这样做了。 为了使得示例简洁并易于阅读,我们违反了自己的规则。代码正确执行时输出结果为123。
class Something
{
public:
Something(){ cout << "2"; }
};
class Parent
{
public:
Parent(){ cout << "1"; }
};
class Child : public Parent
{
public:
Child() { cout << "3"; }
protected:
Something mDataMember;
};
int main()
{
Child myChild;
return 0;
}
当创建myChild对象时,首先调用Parent的构造函数,输出字符串“1"。随后,mDataMember被初始化,调用Something构造函数,输出字符串“2"。最后,Child的构造函数被调用,输出“3 "。
注意Parent的构造函数被自动调用。C++-将自动调用父类的默认构造函数(如果存在的话)。如果父类的默认构造函数不存在,或者存在默认构造函数但是您希望使用其他构造函数,可在构造函数初始化器中(constructor initializes)像初始化数据成员那样链接构造函数。
下面的代码显示了没有默认构造函数的Super版本。相关版本的Sub必须显式地告诉编译器如何调用Super的构造函数,否则代码将无法编译。
class Super
{
public:
Super(int i);
}
class Sub : public Super
{
public:
Sub();
}
Sub::Sub() : Super(7)
{
// Do Sub's other initialization here
}
在前面的代码中,Sub构造函数向Super的构造函数传递了固定值(7)。如果Sub的构造函数需要一个参数,也可以传递变量:
Sub::Sub(int i) : Super(int i)
从子类向超类传递构造函数的参数很正常,毫无问题,但是无法传递数据成员。如果这么做,代码可以编译,但是记住在调用超类构造函数之后数据成员才会初始化。如果将数据成员作为参数传递给父类构造函数,数据成员不会被初始化。