【问题标题】:What is multiple virtual inheritance?什么是多重虚拟继承?
【发布时间】:2012-05-08 19:05:45
【问题描述】:
class foo : public virtual bar, public virtual kung
{
  // implementation of the method of the above inherited class
};

bar and kung 类是一个抽象类,它包含在 foo 类内部实现的纯虚方法。

这个有什么用?

【问题讨论】:

标签: c++ virtual-inheritance


【解决方案1】:

在你的情况下,如果 bar 和 kung 是最派生的基类,只要 bar 和 kung 中没有方法冲突,你就会知道它,即编译器在模糊定义中的错误。

在 c++ 常见问题解答中了解更多信息:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9

【讨论】:

    【解决方案2】:

    如果其他未来的类以不止一种方式从foo派生,那么最派生的类将只包含一个,虚拟基类barkung

    struct A : foo { };
    struct B : foo { };
    
    class Gizmo : public A, public B { }; // only *one* bar and kung base class.
    

    Gizmo 类型的对象具有类型为 bar 的唯一基本子对象,kung 也是如此,而不是每个派生路径有两个不同的子对象。

    注意,如果一个类只有纯虚函数,没有非静态成员,只有相同性质的基类,那么虚继承和非虚继承之间没有实际区别,因为课程是空的。其他较小的语言将此类类称为“接口”,这意味着可以从它们乘以继承,即使此类语言不支持通用类的多重继承。

    【讨论】:

    • 那么没有实际区别”错了! “因为类是空的”它们不是;他们有一个 vptr!
    • @curiousguy:就语言而言,这些课程还是空的。 C++ 中没有“vptr”;这只是一个实现细节。
    • "就语言而言,这些类仍然是空的。" 根据? “C++ 中没有“vptr”;这只是一个实现细节。” 吹毛求疵。
    【解决方案3】:

    通过这样做,foo 类是 bar 和 isa kung。

    如果您有一个接受 bar 对象的函数或方法,则 foo 类的实例化将符合条件。由于 bar 类具有纯虚方法,如果对象被实例化,编译器将需要 foo(或从 foo 派生的类)来定义方法。然后,获取 bar 对象的代码可以依赖于知道传递给它的 bar 对象实现了该方法,即使该对象是 foo 类的实例(或从 foo 派生的类)。

    对于功夫类也是如此。

    因此,如果 foo 类实现了 bar an kung 中的所有纯虚方法(编译器将需要它来实例化 foo 对象),那么 foo 对象可以传递给任何需要 bar、kung 或 a foo 对象。

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2014-10-12
      • 2011-08-20
      • 2011-10-15
      相关资源
      最近更新 更多