首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将创建的vtable数目

将创建的vtable数目
EN

Stack Overflow用户
提问于 2022-12-03 20:28:04
回答 1查看 39关注 0票数 0

在这里,如果B类为空,那么总共将在这里创建多少个vtable?

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

class A{
  public:
      virtual void display(){
        cout<<"A Class"<<endl;
      }
};

class B: public A{
  public:

};

int main() 
{
    A *ob = new B();
    ob->display();//A Class
    return 0;
}

我假设仍然会创建两个vtable,一个在A中,一个在B中,但是对于B类,它将是空的,按照c++的设计,如果我们调用显示函数,那么如果它在vtable中找不到函数,那么它将在父类中查找vtable,并使用vptr设置该函数的绑定,但是,我不确定这一点。

有人能用确切的概念来解释吗

我厌倦了在网上找到答案,但没有得到想要的答案

EN

回答 1

Stack Overflow用户

发布于 2022-12-04 05:21:51

实际上,B需要一些运行时类型信息,这些信息通常作为"vtable“的一部分存储,与A不同。

这是因为:

代码语言:javascript
复制
bool test(A* a) {
  return dynamic_cast<B*>(a);
}

如果我们将指针传递给B或指针到A,则必须采取不同的行为。

在C++中实现vtable的“典型”方法如下所示:

代码语言:javascript
复制
using vfunc = void(*)(void*);
template<auto creator>
static auto const* get_vtable() {
  static const auto table = creator();
  return &table;
}
struct A_vtable {
  void const* rtti;
  void(*display)(void*);
};
A_vtable create_A_vtable_A() {
  return {
    "This is class A!",
    [](void* self) {
      std::cout<<"A Class"<<std::endl;
    }
  };
}
struct A {
  A_vtable const* vtable;
  A():vtable(get_vtable<&create_A_vtable_A>()) {}
};
struct B_vtable:A_vtable {
};
B_vtable create_B_vtable_B() {
  B_vtable vtable = create_A_vtable_A;
  vtable.rtti = "This is class B!";
}
struct B:A {
  B() {
    vtable = get_vtable<&create_B_vtable_B>();
  }
};

请注意,我的运行时类型信息是故意开的玩笑。

真实情况下的RTTI信息将告诉您运行时类型是什么,以及如何获得指向派生最多的类型的指针。这里我只存储一个指向字符串的空指针。

但是您会注意到,我将vtable指针移到B构造函数中的另一个表中。基本上,编译器就是这样做的(这个标准给了编译器很多自由,所以您不能假设它看起来像上面的样子,它甚至可能没有vtable)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74670436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档