C++ 中的类接口继承

Posted

技术标签:

【中文标题】C++ 中的类接口继承【英文标题】:Interface-like inheritance in C++ 【发布时间】:2011-01-08 14:51:57 【问题描述】:

我有以下情况,图为我的类的理论继承图:

这个想法基本上是为了

1) 有两个可以在不同平台上实现的抽象基类(在我的例子中是两个不同的操作系统)

2) 允许 BBase 向上转换为 ABase 以便有时能够平等地处理两者(例如,将两种类型的实例保存在一个列表中)。

3) 在 ABase 和 BBase 中实现某些通用功能。

现在,用 C++ 表示这一点的最佳方式是什么?尽管它确实支持多重继承,但据我所知,这样的多级继承是不可能的。问题是 B 继承自 A 和 BBase,而后者又继承自 ABase。简单地用 C++ 翻译这个 1:1(以下代码),C++ 编译器(GNU)会抱怨 ABase::foo() 没有在 B 中实现。

class ABase

public:
    virtual void foo() = 0;
    void someImplementedMethod() 
;

class BBase : public ABase

public:
    virtual void bar() = 0;
    void someOtherImplementedMethod() 
;

class A : public ABase

public:
    A() 
    void foo() 
;

class B : public A, public BBase

public:
    B() : A() 
    void bar() 
;

int main()

    B b;
    return 0;

您将如何更改此继承模型以使其与 C++ 兼容?

编辑:图表中的反向箭头并将“向下转换”更正为“向上转换”。

【问题讨论】:

“BBase 可以向下转换为 ABase”你的意思是向上转换,对吧? 是的,感谢您的提示。图中的箭头也是如此。 【参考方案1】:

您可以通过 virtual inheritance 直接在 C++ 中使用该类型的层次结构:

class ABase...;
class BBase : public virtual ABase ...;
class A     : public virtual ABase ...;
class B     : public A, public BBase ...;

当然,如果您打算拥有更多级别,那么对 B 也使用虚拟继承可能是个好主意,这样您就会得到

class B     : public virtual A, public virtual BBase ...;

【讨论】:

关于将virtual 用于BBase 的好评论。像这样决定哪些类是菱形中的接口以及virtual 在逻辑上正确的位置是很好的。 哇,你的答案来得真快!非常感谢,虚拟继承正是我所需要的! 虽然class A 严格来说是一个实现类,但它没有必要是virtual 基类。

以上是关于C++ 中的类接口继承的主要内容,如果未能解决你的问题,请参考以下文章

C++中的接口继承

C++ 中的继承和接口

9-2:C++多态之纯虚函数和抽象类以及接口继承和实现继承

Java中的类继承机制接口

C++ 中的流利接口和继承

12.面向对象(继承/super/接口/抽象类)