当虚拟继承是一个好的设计?

Rom*_*n L 26 c++ multiple-inheritance virtual-inheritance

编辑3:请务必在回答之前清楚地了解我的要求(有EDIT2和很多评论).有(或有)许多答案清楚地表明对问题的误解(我知道这也是我的错,对不起)

嗨,我class B: public virtual A {...}在C++中查看了关于虚拟继承()的问题,但没有找到我的问题的答案.

我知道虚拟继承存在一些问题,但我想知道的是虚拟继承被认为是一种好的设计.

我看到人们提到类似IUnknownor的接口ISerializable,而且该iostream设计也基于虚拟继承.那些是很好地利用虚拟继承的好例子,是因为没有更好的选择,或者因为在这种情况下虚拟继承正确的设计?谢谢.

编辑:澄清,我问的是现实生活中的例子,请不要抽象.我知道虚拟继承是什么以及哪种继承模式需要它,我想知道的是何时它是做事的好方法而不仅仅是复杂继承的结果.

EDIT2:换句话说,我想知道钻石层次结构(这是虚拟继承的原因)何时是一个好的设计

CB *_*ley 24

如果您具有接口层次结构和相应的实现层次结构,则必须使接口基类成为虚拟基础.

例如

struct IBasicInterface
{
    virtual ~IBasicInterface() {}
    virtual void f() = 0;
};

struct IExtendedInterface : virtual IBasicInterface
{
    virtual ~IExtendedInterface() {}
    virtual void g() = 0;
};

// One possible implementation strategy
struct CBasicImpl : virtual IBasicInterface
{
    virtual ~CBasicImpl() {}
    virtual void f();
};

struct CExtendedImpl : virtual IExtendedInterface, CBasicImpl
{
    virtual ~CExtendedImpl() {}
    virtual void g();
};
Run Code Online (Sandbox Code Playgroud)

通常,只有在扩展基本接口的多个接口和不同情况下需要的多个实现策略时才有意义.这样,您就拥有了清晰的接口层次结构,并且您的实现层次结构可以使用继承来避免常见实现的重复.但是,如果您使用的是Visual Studio,则会收到很多警告C4250.

为了防止意外切片,通常最好是CBasicImplCExtendedImpl类不可实例化,而是具有更高级别的继承,除了构造函数之外不提供额外的功能.

  • @anatolyg候选人有史以来最愚蠢的警告. (6认同)