代码之家  ›  专栏  ›  技术社区  ›  Bri Bri

如果不为具有不同签名的不同派生构造函数调用基类的构造函数,会发生什么?

  •  0
  • Bri Bri  · 技术社区  · 2 年前

    假设我有这样一个基类和派生类:

    class Base {
    public:
        Base() { ... };
        Base(int param) { ... };
    };
    
    class Derived : public Base {
    public:
        Derived() { ... };
        Derived(int param) { ... };
        Derived(int p1, int p2) { ... };
    };
    

    请注意,我 明确地调用 Base 的构造函数 Derived 的构造函数。也就是说,我 没有 Derived() : Base() { ... } Derived(int param) : Base(param) { ... } .

    有没有 基础 在创建的实例时,默认情况下会调用的构造函数 衍生 ?

    如果是,是吗 Base(int param) 使用时接到电话 Derived(int param) ,或者 Base() 接到电话了吗?

    换句话说,如果不指定要使用哪个构造函数,C++是否总是默认使用与派生类构造函数具有相同签名的基类构造函数?还是只使用基类的默认构造函数?

    如果是前者,那么在派生类中使用的构造函数在基类中没有具有相同签名的匹配构造函数(例如 Derived(int p1, int p2) ?

    请注意这个问题 没有 与任一类的成员变量的初始化相关。我故意不在伪代码中包含任何成员变量。它特别与基类上使用的构造函数有关 如果没有显式指定基构造函数 在派生类的构造函数中。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Nathan Pierson    2 年前

    引用cppreference的 description 以及继承与构造函数的关系:

    在构成构造函数函数体的复合语句开始执行之前,所有 直接基地 ,虚拟基和非静态数据成员完成。 成员初始值设定项列表是可以指定这些对象的非默认初始化的位置。 对于不能默认初始化的基和非静态数据成员,例如引用和常量限定类型的成员,必须指定成员初始值设定项。对于没有成员初始值设定项的匿名联合或变体成员,不会执行初始化。

    (重点补充。)

    如果未在派生类的构造函数的成员初始值设定项列表中指定基类子对象的初始化,则基类子对象默认已初始化。