【问题标题】:vtable in case of virtual inheritance [duplicate]虚拟继承的情况下的vtable [重复]
【发布时间】:2017-12-12 20:58:06
【问题描述】:

在虚拟继承的情况下,vtable 有什么用(或者为什么需要 vtable)?在这种情况下,这个 vtable 指向什么。

示例:

class A
{
    void show()
    { }
};

class B : virtual A
{
    void disp()
    { }
};

在上面的例子中,B 类的大小是 8 个字节。这意味着 B 类的 vptr 指向一个 Vtable。这个 vtable 指向什么。

【问题讨论】:

  • C++ 标准对 vtables 的主题没有什么可说的。因此,这些概念是特定于编译器的。你在哪个编译器上试过这个?
  • GCC 和 Clang 将它用于类型信息。
  • vtable 由指向函数的指针组成,所以它指向的基本上是机器代码块。
  • @melpomene,OP 实际上要问的是:在没有任何虚函数的正常继承的情况下,大多数编译器都不会打扰 vtable。在这种情况下,没有虚函数,但仍然有一个 vtable,这对他来说很奇怪。
  • @Frank ,是的,这正是我的问题。我读过这些 vtable 指向 A 类的子对象。这是真的吗?

标签: c++ inheritance virtual


【解决方案1】:

vtable 是在 C++ 中实现virtual 关键字的最常用方法——任何使用virtual 关键字的类都会为其创建一个vtable,并且该类的每个实例都将包含一个指向它的指针(单)vtable。 vtable 包含有关对象动态类的信息(以支持dynamic_casttypeinfo)以及有关该类的虚拟基类和函数所在位置的信息。

在这种特定情况下,B 的 vtable 可能只包含动态类信息,因为 A 没有数据成员或虚函数。

【讨论】:

  • 请注意,您只能在多态类上使用 dynamic_casttypeinfo,而不能在像 B 这样的具有虚拟基的类上使用,即使在许多 (但不是全部)编译器。
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2014-06-29
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多