【发布时间】:2021-11-13 03:33:32
【问题描述】:
因此,作为我程序的公共 API 的一部分,我公开了 D 类,以便用户从 D 类继承来创建自己的类。
然而,D 类是致命钻石的尖端,我遇到了一个问题,即用户的类正在调用 A 类的默认构造函数,而不是根据需要调用参数化构造函数。
A
/ \
B C
\ /
D
|
E or F
在下面的代码中,类 E 是一个干净的 API,但是调用了错误的 A 构造函数。 F 类按预期工作,但是用户必须添加 A 的参数化构造函数,这很难看,因为该类是一个内部类。
有没有办法让 E 类按预期工作?为什么会这样?
#include<iostream>
using namespace std;
class A {
public:
A(int x) { cout << "A::A(int ) called" << endl; }
A() { cout << "A::A() called" << endl; }
};
class B : virtual public A {
public:
B(int x): A(x) {
cout<<"B::B(int ) called"<< endl;
}
};
class C : virtual public A {
public:
C(int x): A(x) {
cout<<"C::C(int ) called"<< endl;
}
};
class D : public B, public C {
public:
D(int x): A(x), B(x), C(x) {
cout<<"D::D(int ) called"<< endl;
}
};
class E : public D {
public:
E(int x): D(x) {
cout<<"E::E(int ) called"<<endl;
}
};
class F : public D {
public:
F(int x): D(x), A(x) {
cout<<"F::F(int ) called"<<endl;
}
};
int main() {
D d(0);
cout<<endl;
E e(1);
cout<<endl;
F f(2);
}
输出:
A::A(int ) called
B::B(int ) called
C::C(int ) called
D::D(int ) called
A::A() called
B::B(int ) called
C::C(int ) called
D::D(int ) called
E::E(int ) called
A::A(int ) called
B::B(int ) called
C::C(int ) called
D::D(int ) called
F::F(int ) called
【问题讨论】:
标签: c++ diamond-problem