C++开发中级


841 浏览 5 years, 4 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)

从子类向超类传递构造函数的参数很正常,毫无问题,但是无法传递数据成员。如果这么做,代码可以编译,但是记住在调用超类构造函数之后数据成员才会初始化。如果将数据成员作为参数传递给父类构造函数,数据成员不会被初始化。