【发布时间】:2010-02-09 00:47:20
【问题描述】:
假设我的钻石继承情况如下:
class A{
public: virtual void foo(){};
};
class B: public virtual A{
public: virtual void foo(){};
};
class C: public virtual A{
public: virtual void foo(){};
};
class D: B, C{};
最后一行产生了一个编译错误,引用了歧义。据我了解,问题在于编译器不知道将哪个 foo 放在 D 的 vtbl 中,但是如果 D 没有定义自己的任何虚函数,为什么还会有一个 vtbl 呢?
【问题讨论】:
-
“虚拟”作为保护级别说明符在您的类声明行中是否有效(例如 B 类:虚拟 A)?
-
它不是保护说明符。它表示一个虚拟基类,这是一种解决钻石问题的合法技巧。
标签: c++ multiple-inheritance vtable