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++ 中的类接口继承的主要内容,如果未能解决你的问题,请参考以下文章