生成此内容的场景非常复杂,因此我将删除一些部分并准确表示所涉及的类。
/* This is inherited using SI by many classes, as normal */
class IBase
{
virtual string toString()=0;
};
/* Base2 can't inherit IBase due to other methods on IBase which aren't appropriate */
class Base2
{
string toString()
{
...
}
};
/* a special class, is this valid? */
class Class1 : public IBase, public Base2
{
};
那么,这有效吗? toString 会不会有冲突?或者Class1可以用Base2::toString来满足IBase吗? 就像我说的,还有很多其他的东西没有显示,所以关于这个例子的主要设计更改的建议可能没有多大帮助......尽管欢迎任何一般性建议/建议。
我的另一个想法是这样的:
class Class1 : public IBase, public Base2
{
virtual string toString()
{
return Base2::toString();
}
};
这构建和链接,但我不知道它是否有隐藏的错误。
最佳答案
您可以使用“虚拟继承”来解决这个问题。
考虑创建一个仅定义纯虚拟 toString
方法的公共(public)基类(或者,实际上,它是对 都有意义的任何方法的纯虚拟版本>IBase
和 Base2
有),例如
class Stringable {
public:
virtual string toString() = 0;
};
然后,让 IBase
和 Base2
都继承自这个 Stringable
类:
class IBase : public Stringable
{
};
class Base2 : public Stringable
{
public:
virtual string toString()
{ ... }
};
现在这仍然行不通,因为 Class1
将继承两个 Stringable
基类的拷贝,只有一个它在其继承层次结构中具有 toString
的实现。这被称为“dreaded diamond”。但是,如果 IBase
和 Base2
从 Stringable
继承虚拟,如下所示:
class IBase : virtual public Stringable
{
};
class Base2 : virtual public Stringable
{
public:
virtual string toString()
{ ... }
};
然后这告诉编译器应该只有一个通用的 Stringable
基类,即使 IBase
和 Base2
都被一个类继承,这正是您想要的,因为 Base2::toString
用于 Class1
。
您的第二个想法没有“隐藏的错误”,但您可能已经意识到,重复实现有点麻烦。
关于C++多重继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2793954/