【发布时间】:2024-08-28 04:25:01
【问题描述】:
考虑以下代码:
#include <iostream>
#include <typeinfo>
#include <type_traits>
using namespace std;
struct A { int data; };
struct B1 : A {};
struct B2 : virtual A {};
struct Base1 : virtual A {};
struct Base2 : virtual A {};
struct Derived : Base1, Base2 {};
int main() {
cout << sizeof(B1) << endl;
cout << sizeof(B2) << endl;
cout << sizeof(Derived) << endl;
cout << std::is_polymorphic<B1>::value << endl;
cout << std::is_polymorphic<B2>::value << endl;
cout << std::is_polymorphic<Derived>::value << endl;
return 0;
}
在我的系统上打印
4
8
12
0
0
0
这意味着这些类都不是多态的。但是,B1 和 B2 的大小因指针的大小而不同,该指针可能是指向 vtable 的指针。我用-fdump-class-hierarchy 运行 gcc 并得到:
Vtable for B2
B2::_ZTV2B2: 3u entries
0 4u
4 (int (*)(...))0
8 (int (*)(...))(& _ZTI2B2)
VTT for B2
B2::_ZTT2B2: 1u entries
0 ((& B2::_ZTV2B2) + 12u)
Class B2
size=8 align=4
base size=4 base align=4
B2 (0x0x3ca5400) 0 nearly-empty
vptridx=0u vptr=((& B2::_ZTV2B2) + 12u)
A (0x0x3c972d8) 4 virtual
vbaseoffset=-12
这里有一个问题:什么是多态类? “具有 vtable”是否意味着“具有多态性并具有 RTTI”,反之亦然?如果不是,为什么它必须至少有一个虚拟函数才能是多态的,如果它无论如何都要有 vtable?
看起来多态类的定义与“具有 vtable 的类”不同,因为正如我们在上面看到的,B2 不是多态的,但有一个 vtable,而且我认为应该有一个 RTTI。在this 文档中明确指出“多态 - 即至少有一个虚函数。(这是允许生成的调度代码在类上使用 RTTI 所必需的。)”。
【问题讨论】:
-
我的意思是,分离“多态类”和“具有 vtable 的类”的目的是什么?
标签: c++ polymorphism rtti virtual-functions virtual-inheritance