在子类的构造函数中调用超类的构造器两次

Calling the superclass' constuctor twice in the subclass' constructor

本文关键字:两次 构造器 超类 子类 构造函数 调用      更新时间:2023-10-16

我有一个用户定义的类,比如A。我有另一个用户定义的 B 类,它公开扩展了 A。

当我定义 B 的构造函数

时,我必须在 B 构造函数的成员初始值设定项列表中调用 A 的构造函数,否则编译器将调用默认构造函数。

class A {
    int a;
public:
    A(int x = 0) {
        a = x;
    }
};
class B : public A {
    int b;
public:
    B(int x = 0) : A(2*x) {
        b = x;
    }
};

现在,我明白了这一切背后的逻辑。但是,我想知道的是当我这样做时会发生什么:

class A {
    int a;
public:
    A(int x = 0) {
        a = x;
    }
};
class B : public A {
    int b;
public:
    B(int x = 0) {
        A(2*x);
        b = x;
    }
};

我的意思是,我们都知道编译器会在 A 的默认构造函数进入 B 的构造函数主体之前调用它。现在,B 构造函数体的第一行是调用 A 的另一个构造函数(它接受参数)。那么,这会导致什么呢?每当创建子类的对象时,都会在此处调用超类的两个不同的构造函数。请解释一下发生了什么...是否将创建两个对象或什么。

这不会调用正在初始化的BA子对象的构造函数。相反,它会创建并销毁类型 A 的临时对象。调用基子对象的构造函数的唯一方法是通过初始化器列表,如第一个示例所示。

现在,B 构造函数体的第一行是调用 A 的另一个构造函数(它接受参数)。那么,这会导致什么呢?

它构造一个临时A并立即丢弃临时对象。该调用与初始化BA部分无关。