Mr.*_*Boy 6 c++ multiple-inheritance
生成这个的场景非常复杂,所以我将删除一些部分并准确表示所涉及的类.
/* 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
{
};
Run Code Online (Sandbox Code Playgroud)
那么,这有效吗?toString会有冲突吗?或者Class1可以使用Base2 :: toString来满足IBase吗?就像我说的那样,还有很多其他的东西没有显示出来,所以对这个例子的主要设计变更的建议可能没那么有用......尽管欢迎任何一般的建议/建议.
我的另一个想法是这样的:
class Class1 : public IBase, public Base2
{
virtual string toString()
{
return Base2::toString();
}
};
Run Code Online (Sandbox Code Playgroud)
这构建和链接,但我不知道它是否有隐藏的错误.
您可以使用“虚拟继承”来解决此问题。
考虑创建一个仅定义纯虚拟方法的公共基类toString(或者,实际上,对IBase和都有意义的任何方法的纯虚拟版本Base2),例如
class Stringable {
public:
virtual string toString() = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后,同时拥有IBase并Base2继承该类Stringable:
class IBase : public Stringable
{
};
class Base2 : public Stringable
{
public:
virtual string toString()
{ ... }
};
Run Code Online (Sandbox Code Playgroud)
现在这仍然不起作用,因为Class1将继承基类的两个副本Stringable,其中只有一个在其继承层次结构中有一个实现toString。这被称为“可怕的钻石”。但是,如果IBase和Base2是从虚拟Stringable继承的,如下所示:
class IBase : virtual public Stringable
{
};
class Base2 : virtual public Stringable
{
public:
virtual string toString()
{ ... }
};
Run Code Online (Sandbox Code Playgroud)
然后,这告诉编译器应该只有一个公共Stringable基类,即使 和IBase都Base2被一个类继承,这正是您想要的,因为然后 theBase2::toString用于Class1.
你的第二个想法没有“隐藏的错误”,但正如你可能意识到的那样,重复实施有点麻烦。