将指针传递给“继承自A和B的类”

时间:2011-01-12 07:16:17

标签: c++ interface multiple-inheritance

我有几个抽象基类,它们的行为类似Java或C#中已知的接口,假设它们是A,B和C.

现在我有一些具体的类,每个类都实现了接口的子集:

class Concrete1: public A, public B
class Concrete2: public A, public C
class Concrete3: public A, public C

在某些时候,我想要一个方法,要求它的参数实现A和C(所以应该可以通过Concrete2和Concrete3)。

我能做到

class AC: public A, public C
class Concrete1: public A, public B
class Concrete2: public AC
class Concrete3: public AC

并接受指向AC的指针,但我不喜欢这种方法,因为它可能会以类似

的方式结束
class AC: public A, public C
class AB: public A, public B
class ABC: public A, public B, public C
class Concrete1: public AB
class Concrete2: public AC
class Concrete3: public AC
class Concrete4: public AC, public AB, public ABC

有什么好的选择吗?

非常感谢!

3 个答案:

答案 0 :(得分:2)

首先,如果这些是公共抽象基类,并且您希望能够将它们用作接口类型,则它们需要是虚拟的 - 否则您将获得重复的基础和模糊问题。

那就是说,如果你需要能够接受既是'A'又有'C'的东西,那么确实有一个'AC'抽象基类,所以你应该只是声明它。

答案 1 :(得分:1)

我认为没有好的选择。因为这个问题是由初始接口故障时的错误引起的。

如果它的负担很重,接口重新设计是真正的好选择。

或者你可以用模板方法,dynamic_cast,盲C风格演员来克服。或者为每个接口制作两种方法。

答案 2 :(得分:0)

如果ABABABC只是接口而且没有任何一个添加任何new功能,那么为什么不呢?写:

class Concrete4: public ABC

而不是

class Concrete4: public AC, public AB, public ABC

他们不是一回事吗?

当然,如果派生接口为其添加了新功能,那么它们就不一样了!


同样,您可以使用ABCAB代替CAB来撰写C

 //class ABC: public A, public B, public C
   class ABC: public AB, public C

注意:我假设ABCABACABC都是接口。即它们都包含纯虚函数而不定义它们。除了具有基本接口的功能之外,它们都没有向自身添加任何新功能。