首页 文章

在继承中调用构造函数的顺序

提问于
浏览
0

我是C编程语言的新手,我对继承中调用构造函数的顺序感到困惑 . 我的问题是,即使构造函数和析构函数不是由派生类继承的,为什么基类构造函数在创建派生类对象时会调用它 .

1 回答

  • 3

    构造函数的目的是定义如何初始化数据成员 . 由于派生类从基类继承数据成员,因此派生类的任何构造函数不仅必须定义如何初始化特定于派生类的数据成员,还要定义来自基类的数据成员 .

    执行此操作(以及C标准所要求的)的自然方法是调用基类构造函数 . 如果未在派生类构造函数的初始化列表中包含特定构造函数调用,则将使用基类的默认构造函数初始化基类成员 .

    struct base
    {
       int _i;               // a data member
       base():_i(0) {}       // default constructor
       base(int i):_i(i) {}  // special constructor
    };
    
    struct derived : base
    {
      int _j;                         // a data member specific to the derived class
      derived(int i, int j):_j(j) {}  // user-defined constructor for the derived class
    };
    

    上面的示例说明了派生类构造函数如何初始化其成员 _j ,但是来自基类的成员 _i 必须使用基类构造函数进行初始化 .

    按照上面的方式编写,默认构造函数 base::base() 将由编译器自动调用,即 _i 将初始化为0 .

    但是您可以通过包含对特定构造函数的调用来更改该行为:

    struct derived : base
    {
      int _j;
      derived(int i, int j):base(i),_j(j) {}  // user-defined constructor for the derived class
    };
    

    构造函数调用的顺序是:基类的第一个构造函数调用,然后是派生类特定成员的初始化程序 . 这很自然,因为派生类在某种意义上是基类的扩展,并且有必要将派生类对象的基类部分视为首先存在 .

相关问题