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

时间:2015-04-15 17:00:38

标签: c++

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

当我定义B的构造函数时,我必须在B&#39的构造函数的成员初始化列表中调用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;
    }
};

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

现在,B&#39的构造函数体的第一行是调用A的另一个构造函数(带参数)。那么,这会导致什么结果呢?

它构造一个临时的A,并立即丢弃临时对象。该调用与初始化A的{​​{1}}部分无关。