为什么以下类有虚拟表?

Eps*_*tor 6 c++ multiple-inheritance vtable

假设我的钻石继承情况如下:

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{};
Run Code Online (Sandbox Code Playgroud)

引用歧义的最后一行产生编译错误.据我所知,问题是编译器不知道在D的vtbl中放置哪个foo,但是如果它没有定义自己的任何虚函数,为什么D甚至会有一个vtbl呢?

Cor*_*y D 7

您将继承包含虚函数的类.因此,您的类具有虚函数.就这么简单.

  • 因为在B和C的声明中没有虚拟,它们不共享共同的A祖先,而是共享独立的A实体. (3认同)