c++ - 什么时候虚拟继承是一个好的设计?

标签 c++ multiple-inheritance virtual-inheritance

EDIT3:请务必在回答之前清楚地理解我的要求(有EDIT2和很多评论)。有(或曾经)很多答案清楚地表明了对问题的误解(我知道这也是我的错,对此感到抱歉)

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

我知道虚拟继承存在一些问题,但我想知道在哪些情况下虚拟继承会被认为是一种好的设计。

我看到有人提到像 IUnknownISerializable 这样的接口(interface),而且 iostream 的设计是基于虚拟继承的。这些是很好地使用虚拟继承的好例子吗,仅仅是因为没有更好的选择,还是因为在这种情况下虚拟继承正确的设计?谢谢。

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

EDIT2:换句话说,我想知道菱形层次结构(这是虚拟继承的原因)什么时候是好的设计

最佳答案

如果你有一个接口(interface)层次结构和一个相应的实现层次结构,那么使接口(interface)基类成为虚拟基类是必要的。

例如

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();
};

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

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

关于c++ - 什么时候虚拟继承是一个好的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605556/

相关文章:

c++ - 如何将数组作为参数传递,并且数组在c++中的参数中定义

c++ - 不区分大小写的 std::字符串集

c++ - 当 ptr_vector 迭代器失效时

c++ - 添加插件 SDK - 是否多重继承?

C++ : Best practice when implementing Multiple inheritance

C++ 多路径继承 : Why the access using Base class scope is non-ambiguous?

c++ - 使用 å ä ö 按字母顺序排序

java - 在Java中实现多重继承

C++:处理这种多重继承的最佳方法是什么?

c++ - 单一虚拟继承