首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟表C++

虚拟表C++
EN

Stack Overflow用户
提问于 2010-02-01 05:45:36
回答 4查看 16.7K关注 0票数 22

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

我的问题是,vtable是只存在于具有虚函数的类,还是也存在于从该类派生的类。

e.g

代码语言:javascript
复制
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,那么输出就不会是“派生打印”。所以,对于任何声明了虚函数的类,以及从该类继承的类,都存在一个vtable。这是正确的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-01 07:05:59

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

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

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

票数 19
EN

Stack Overflow用户

发布于 2010-02-01 05:49:58

是的,你的理解是正确的。任何具有任何虚函数的基类都有一个vtable。

票数 3
EN

Stack Overflow用户

发布于 2010-02-01 05:56:05

是的是真的。实际上,给定base的定义:

代码语言:javascript
复制
class derived:public base{
public:
 void print(){cout<<"derived print\n";}
};

完全等同于:

代码语言:javascript
复制
class derived:public base{
public:
 virtual void print(){cout<<"derived print\n";}
};

..。因为您已经在base中将print定义为virtual。

我希望编译器能强制执行...

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

https://stackoverflow.com/questions/2173493

复制
相关文章

相似问题

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