C++ 是否所有类都有编译器为其创建的Vtable?

C++ 是否所有类都有编译器为其创建的Vtable?,c++,vtable,C++,Vtable,网上有很多关于VTables的资源。他们通常有相同的声明: “每当类本身包含虚拟函数或重写父类中的虚拟函数时,编译器都会为该类构建vtable这意味着并非所有类都有编译器为其创建的vtable。vtable包含指向该类中虚拟函数的函数指针。每个类只能有一个vtable,同一类的所有对象将共享同一个vtable。“ 那么,为什么这意味着并非所有类都有编译器为其创建的vtable?这是因为somc类没有虚拟函数吗?确切地说。有些类没有vtable,因为它们没有任何虚拟方法 虚拟方法是编译器无法为其生

网上有很多关于VTables的资源。他们通常有相同的声明:

“每当类本身包含虚拟函数或重写父类中的虚拟函数时,编译器都会为该类构建vtable这意味着并非所有类都有编译器为其创建的vtable。vtable包含指向该类中虚拟函数的函数指针。每个类只能有一个vtable,同一类的所有对象将共享同一个vtable。“


那么,为什么这意味着并非所有类都有编译器为其创建的vtable?这是因为somc类没有虚拟函数吗?

确切地说。有些类没有vtable,因为它们没有任何虚拟方法

虚拟方法是编译器无法为其生成直接调用的方法,因为它随类的实现而变化。Vtables是一种查找表,它通过在程序运行时延迟决定调用哪个实现来解决此问题:您的compiler在vtable上生成一个方法查找,然后调用返回的方法

举个例子:

class Foo
{
public:
    virtual void vMethod()
    {
        std::cout << "Foo::vMethod was called!" << std::endl;
    }
};

class Bar : public Foo
{
public:
    virtual void vMethod()
    {
        std::cout << "Bar::vMethod was called!" << std::endl;
        std::cout << "This is not the same as Foo::vMethod." << std::endl;
    }
};

Foo* foo = new Bar;
foo->vMethod();
class-Foo
{
公众:
虚拟void vMethod()
{

事实上,C++中没有任何东西要求任何类都有一个VTABLE——这完全是一个实现问题。然而,一个具有虚拟函数的类必须支持多态函数调用,并且这总是需要某种表/映射。这个表/映射将由编译器创建具有多态功能的类。NS和可能(取决于编译器质量)为那些不存在的人创建。

< P>另外,一些类没有明确的VTABLE,因为明确地删除了,参见(编译器特定)

,你知道有没有一个C++编译器,不管质量有多差,都创建了VTABLE(或者任何模拟)。对于没有多态函数的类,我没有,有一个很好的理由:为了实现<代码>外“C”<代码>,C++编译器必须已经支持没有VTABLE的结构。