在这里,如果B类为空,那么总共将在这里创建多少个vtable?
#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设置该函数的绑定,但是,我不确定这一点。
有人能用确切的概念来解释吗
我厌倦了在网上找到答案,但没有得到想要的答案
发布于 2022-12-04 05:21:51
实际上,B需要一些运行时类型信息,这些信息通常作为"vtable“的一部分存储,与A不同。
这是因为:
bool test(A* a) {
return dynamic_cast<B*>(a);
}如果我们将指针传递给B或指针到A,则必须采取不同的行为。
在C++中实现vtable的“典型”方法如下所示:
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)。
https://stackoverflow.com/questions/74670436
复制相似问题