假设我有 A、B、C 和 D 四个班级:
class A {
public:
float someData;
float someFunc();
}
class B : public A {
public:
float someOtherData;
float someOtherFunc();
}
class C : public A {
public:
float evenMoreData;
float evenMoreFuncs();
}
class D : public B, public C {
public:
float andMoreData;
float andMoreFuncs();
}
现在我希望 D 只继承 A 的一个实例。 我知道这是钻石继承,我可以通过在B和C中添加一个虚拟到“公共A”来解决这个问题,但这里的问题是B和A属于一个库,我无法更改。
除了让 B 成为 D 的成员并包装 B 的所有成员函数之外,还有什么方法可以做到这一点吗?
编辑: 正如评论中所指出的,在这种情况下,B 不需要从 A 继承,但 B 也充当其他类的基类,这些类本身不继承任何继承 A 的类。
这里的问题是
和B
属于一个库,我无法更改。A
好的,所以只剩下更改
C
和 D
的唯一选项。
您可以将
C
制作为类模板,然后可以使用它来继承 A
或 B
- 对于 D
,您将选择 C<B>
:
template<class Base>
class C : public Base {
public:
float evenMoreData;
float evenMoreFuncs();
};
class D : public C<B> {
public:
float andMoreData;
float andMoreFuncs();
};