4
class foo : public virtual bar, public virtual kung
{
  // implementation of the method of the above inherited class
};

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

这个有什么用?

4

3 回答 3

1

在您的情况下,如果 bar 和 kung 是派生最多的基类,只要 bar 和 kung 中没有任何方法发生冲突,那么您就会知道它是否发生冲突,即编译器在不明确的定义中出现错误。

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

于 2012-05-08T19:10:54.973 回答
0

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

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

功课也是如此。

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

于 2012-05-08T21:20:28.497 回答
0

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

struct A : foo { };
struct B : foo { };

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

type 的对象Gizmo具有唯一的 type 基础子对象,bar对于 , 也是如此kung,而不是每个派生路径都有两个不同的子对象。

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

于 2012-05-08T19:11:48.310 回答