【问题标题】:Why does the following class have a virtual table?为什么下面的类有一个虚拟表?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 那么也许我遗漏了一些东西,因为当我从继承规范(B 类:A,C 类:A)中删除“虚拟”一词时,它会编译并运行。不应该因为我“继承包含虚函数的类”而存在问题吗?
  • 从class B和class C的方法声明中删除关键字virtual。重新编译看看会发生什么。
  • @Thomas 当然,那么我们没有问题,但我问的不是这种情况。如果从具有虚函数的类继承会自动导致继承类的 vtbl,为什么当我仅使用“公共”继承进行继承时,问题就消失了?我仍然从具有虚函数的类继承。
  • 因为B和C的声明中没有virtual,所以它们不共享一个共同的A祖先而是独立的A实体。
猜你喜欢
  • 2011-03-01
  • 2023-03-23
  • 1970-01-01
  • 2019-01-10
  • 2020-12-01
  • 2015-03-05
  • 2011-02-04
  • 2014-07-04
  • 1970-01-01
相关资源
最近更新 更多