C++多重继承问题

标签 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
{
};

那么,这有效吗? toString 会不会有冲突?或者Class1可以用Base2::toString来满足IBase吗? 就像我说的,还有很多其他的东西没有显示,所以关于这个例子的主要设计更改的建议可能没有多大帮助......尽管欢迎任何一般性建议/建议。

我的另一个想法是这样的:

class Class1 : public IBase, public Base2
{
 virtual string toString()
 {
   return Base2::toString();
 }
};

这构建和链接,但我不知道它是否有隐藏的错误。

最佳答案

您可以使用“虚拟继承”来解决这个问题。

考虑创建一个定义纯虚拟 toString 方法的公共(public)基类(或者,实际上,它是对 都有意义的任何方法的纯虚拟版本>IBaseBase2 有),例如

class Stringable {
  public:
    virtual string toString() = 0;
};

然后,让 IBaseBase2 都继承自这个 Stringable 类:

class IBase : public Stringable
{
};

class Base2 : public Stringable
{
public:
   virtual string toString()
   { ... }
};

现在这仍然行不通,因为 Class1 将继承两个 Stringable 基类的拷贝,只有一个它在其继承层次结构中具有 toString 的实现。这被称为“dreaded diamond”。但是,如果 IBaseBase2Stringable 继承虚拟,如下所示:

class IBase : virtual public Stringable
{
};

class Base2 : virtual public Stringable
{
public:
   virtual string toString()
   { ... }
};

然后这告诉编译器应该只有一个通用的 Stringable 基类,即使 IBaseBase2 都被一个类继承,这正是您想要的,因为 Base2::toString 用于 Class1

您的第二个想法没有“隐藏的错误”,但您可能已经意识到,重复实现有点麻烦。

关于C++多重继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2793954/

相关文章:

c++ - ref-qualifier `const &&` 有什么用?

c++ - 对 boost::filesystem::detail::copy_file 的 undefined reference

java - java中的类不支持多重继承,但接口(interface)可以,为什么?

oop - 多重继承的确切问题是什么?

c++ - C++ 中的菱形继承(钻石问题)代码未按预期工作

c++ - 散列不是很长的字符串 vector (url)的最佳方法是什么?

c++ - 在 Windows 中检测全屏应用程序退出

Java 8 默认方法继承

c++ - 如何在 Qt 项目 View 中为单个单元格设置委托(delegate)?

scala - 使用多重继承从Scala中的不同特征调用不同的方法