C ++多重继承问题

该方案产生这是相当复杂的,所以我会带出了几件,给所涉及的类的精确表示。

/* 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方法(或,在现实中,纯的任何方法的虚拟版本,它是有道理的,既IBaseBase2有),例如:

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在其继承层次。 这被称为“可怕的钻石”。 但是,如果IBaseBase2是从几乎继承Stringable ,就像这样:

class IBase : virtual public Stringable
{
};

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

那么这告诉编译器应该只有一个共同的Stringable即使基类IBaseBase2都是由一个类,而这正是你想要的东西继承下来的,因为那时Base2::toString用于Class1

你的第二个想法有没有“隐藏的错误”,但有些在屁股痛的反复执行,因为你可能实现。

这应该只是罚款。

你正确地覆盖IBase的接口提供的定义ToString()将forwared达Base2::ToString()

需要注意的是Base2未声明的toString()作为虚拟的,所以Class1不能覆盖的行为Base2::ToString 。 无歧义那里。

并且,此外,这不是由虚拟继承解决,因为它们不共享一个基础类多重继承的经典金刚石问题。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#中,多重继承
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.360 (s). 10 q(s)