C++ 构造函数调用顺序



C++ 中带有继承的构造函数调用顺序

在本教程中,我们将学习构造函数调用顺序,如果对C++中的构造函数不熟悉,可以翻看以前的C++构造函数教程。

c++构造函数调用顺序

派生类构造函数中的基类默认构造函数:

当我们从基类派生一个类时,基类的所有数据成员都将成为派生类的成员,我们使用构造函数来初始化数据成员,这里就会有一个问题,谁将负责初始化这些被继承的数据?要初始化这些数据就必须要使用构造函数,这就是基类的构造函数先被调用的原因,在下面给出的示例中,我们可以看到继承类中构造函数的执行顺序如下:

#include <iostream>
using namespace std;
class Base
{
   int x;

public:
   // 默认构造函数
   Base()
   {
      cout << "基类默认构造函数\n";
   }
};

class Derived : public Base
{
   int y;

public:
   // 默认构造函数
   Derived()
   {
      cout << "派生类默认构造函数\n";
   }
   // 带参数的构造函数
   Derived(int i)
   {
      cout << "派生类带参数的构造函数\n";
   }
};

int main()
{
   Base b;
   Derived d1;
   Derived d2(10);
}

以上实例输出结果:

基类默认构造函数
基类默认构造函数
派生类默认构造函数
基类默认构造函数
派生类带参数的构造函数


派生类构造函数中的基类参数化构造函数:

让我们看看我们如何在派生类中调用参数化构造函数,我们需要在派生类中使用: 运算符显式地调用基类的带参数的构造函数。

#include <iostream>
using namespace std;
class Base
{ 
    int x;
    public:
    // 带参数的构造函数
    Base(int i)
    { 
        x = i;
        cout << "基类带参数的构造函数\n";
    }
};

class Derived: public Base
{ 
    int y;
public:
    // 带参数的构造函数
    Derived(int j):Base(j)
    { 
        y = j;
        cout << "派生类带参数的构造函数\n";
    }
};

int main()
{
    Derived d(10) ;
}

以上实例输出结果:

基类带参数的构造函数
派生类带参数的构造函数

C++ 中具有继承的构造函数调用的顺序,总结一下,有如下原则:

  • 构造总是从 基类 开始,如果有多个基类,则从最左边的基类构造函数调用,如果存在 virtual 继承,则优先级更高。
  • 然后数据成员初始化,它们按照声明的顺序进行。
  • 最后,本身就被构造好了。
  • 析构函数的顺序正好与构造函数相反,即先调用子类的析构再调用基类的。

相关教程: