在 C++ 中,如何使同一个基类派生两次?

xxh*_*hxx 1 c++

假设有一个类A

我希望我的类从两次派生A,以便管理两个A段并访问它们的受保护方法。

喜欢:

typedef A yetA;

class D: public A, public yetA {};
Run Code Online (Sandbox Code Playgroud)

这是行不通的。有没有办法做到这一点?

Sto*_*ica 6

首先......我会提醒您重新考虑这个设计,因为(除非有任何其他细节)它看起来有点狡猾。我愿意打赌组合可能会更好地管理这些多个实例。

但是......如果你要这样做,你可以通过中间继承来实现。同一直接基数不能出现多次,但允许间接基数。

template<int N>
struct ACopy : A {
    using A::A;
};

class D: public ACopy<1>, public ACopy<2> {
};
Run Code Online (Sandbox Code Playgroud)

只需通过相应的中间基础即可消除歧义。

或者(或另外),模板ACopy可以使用 using 声明将您关心的受保护成员变为公共成员*。这应该有助于我建议的构图。


* - C++ 的一个经常被忽视的方面是“受保护”实际上是“需要一些额外步骤的公共”。