我需要将哪些基类构造函数放入初始化列表中?

时间:2018-12-27 23:16:21

标签: c++

考虑给出的代码:

class A {
public:
    A(int x) {}
};

class B : public virtual A {
public:
    B(int x) : A(1) {}
};

class C : public virtual A {
public:
    C(int x) : A(2) {}
};

class D : public B, public C {
public:
    D(int x) : A(3), B(1), C(1) {}
};

class E : public D {
public:
    E(int x) : A(4), D(1) {}
};

我的第一个问题是,为什么我们需要在E和D的初始化列表中调用A的构造函数,因为它已经在B和C中指定了? 换句话说,为什么下面的方法不起作用?

class A {
public:
    A(int x) {}
};

class B : public virtual A {
public:
    B(int x) : A(1) {}
};

class C : public virtual A {
public:
    C(int x) : A(2) {}
};

class D : public B, public C {
public:
    D(int x) : B(1), C(1) {}
};

class E : public D {
public:
    E(int x) : D(1) {}
};

这样,下面的代码将调用A(1),B(1),C(1),D(1),E(1)。 正确的旧版本调用A(4),B(1),C(1),D(1),E(1)

E test(1); 

我的另一个问题是,为什么我们不需要将B和C的构造函数添加到E的初始化列表中,而不必为D做呢。

0 个答案:

没有答案