gpt4 book ai didi

C++多重继承问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:09 25 4
gpt4 key购买 nike

生成此内容的场景非常复杂,因此我将删除一些部分并准确表示所涉及的类。

/* 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com