gpt4 book ai didi

c++ - 在下面的程序中创建了多少个虚表?

转载 作者:太空狗 更新时间:2023-10-29 20:36:23 25 4
gpt4 key购买 nike

我在 stackoverflow 中看到很少有显示 vtables 概念的示例,但给出的示例仅适用于单个类,当我们从两个抽象类派生类时,将为该类创建多少 vtables?

class A {
public :
virtual void func_1() = 0;
};

class B {
public :
virtual void func_2() = 0;
};

class C : public A, public B {
public :
void func_1()
{
cout << "func_1" << endl;
}
void func_2()
{
cout << "func_2" << endl;
};

在上面的例子中,C 类有多少个虚表,A 类和 B 类会有虚表吗??

最佳答案

在这种特定情况下,C 有一个 vtable 而 A 和 B 没有。您可以通过外联 C 的成员函数亲眼看到这一点,这样 vtable 将实际发出,并更正其他编译错误:

extern "C" int puts(const char *);

struct A { virtual void func_1() = 0; };
struct B { virtual void func_2() = 0; };

struct C : A, B
{
void func_1();
void func_2();
};

void C::func_1() { puts("func_1"); }
void C::func_2() { puts("func_2"); }

...编译成目标文件,然后查看符号:

$ gcc -c test.cc
$ nm test.o | c++filt
U puts
0000000000000000 T C::func_1()
000000000000001a T C::func_2()
0000000000000033 T non-virtual thunk to C::func_2()
0000000000000000 V typeinfo for A
0000000000000000 V typeinfo for B
0000000000000000 V typeinfo for C
0000000000000000 V typeinfo name for A
0000000000000000 V typeinfo name for B
0000000000000000 V typeinfo name for C
0000000000000000 V vtable for C
U vtable for __cxxabiv1::__class_type_info
U vtable for __cxxabiv1::__vmi_class_type_info

编译器可以证明只有 C 的基本 vtable 是必需的,因为所有类都没有数据或非平凡的构造函数,并且因为 A 和 B 不能直接实例化。在一般情况下,所有三个类可能有多个虚表。何时需要多个 vtable 的确切规则非常复杂,我不打算在这里总结它们。它们在 "Itanium" C++ ABI 中有详细说明。 ,第 2.5 和 2.6 节,但如果您不习惯阅读标准语言并且非常熟悉 C++ 的黑暗角落,它们可能没有多大意义;不幸的是,我不知道对初学者有什么好的概述。 (从历史上看,要么您不关心,要么您已经是专家。)(“Itanium”在上面的引号中是因为规范是编写时考虑到 Itanium,但当时的设计被广泛采用。除非你正在使用 MSVC,否则你可能会得到这个 C++ ABI。)(为了说明这些黑暗的角落是多么黑暗:我帮助编写这个 ABI 规范,但我没有为什么 GCC 认为它需要发出一个“非虚拟 thunk 到 C::func_2”。)

关于c++ - 在下面的程序中创建了多少个虚表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com