gpt4 book ai didi

c++ - 虚拟表 C++

转载 作者:IT老高 更新时间:2023-10-28 21:51:36 25 4
gpt4 key购买 nike

我读到很多人写“一个虚拟表存在于一个类中,该类中声明了一个虚函数”。

我的问题是,vtable 是否仅存在于具有虚函数的类,或者它也存在于从该类派生的类。

例如

class Base{
public:
virtual void print(){cout<<"Base Print\n";}
};
class Derived:public Base{
public:
void print(){cout<<"Derived print\n";}
};

//From main.cpp
Base* b = new Derived;
b->print();

问题:如果没有用于派生类的 vtable,那么输出就不会是“派生打印”。因此,IMO 对于任何声明了虚函数的类以及从该类继承的类都存在一个 vtable。这是正确的吗?

最佳答案

就仅考虑特定于虚函数的功能而言,在实现 vtable 的传统方法中,派生类需要单独版本的 vtable当且仅当派生类覆盖至少一个虚函数。在您的示例中,Derived 覆盖了虚函数 print。由于 Derived 有自己的 print 版本,所以 Derived vtable 中的对应条目与 Base vtable 中的对应条目不同.这通常需要为 Derived 单独创建一个 vtable。

如果 Derived 根本没有覆盖任何东西,形式上它仍然是一个单独的多态类,但为了使其虚函数正常工作,我们可以简单地重用 Base vtable 也适用于 Derived。因此,从技术上讲,Derived 不需要单独的 vtable。

然而,在实际实现中,我们通常称为“vtable”的数据结构通常还包含一些额外的特定于类的信息。这些额外的信息是如此特定于类,以至于大多数时候不可能在层次结构中的不同类之间共享 vtable,即使它们使用相同的一组虚函数。例如,在一些实现中,存储在每个多态对象中的 vtable 指针指向还存储关于类的所谓“RTTI 信息”的数据结构。出于这个原因,在大多数(如果不是全部)实际实现中,每个多态类都有自己的 vtable,即使存储在这些表中的虚函数指针恰好是相同的。

关于c++ - 虚拟表 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173493/

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