C++ 将创建多少个V选项卡?

C++ 将创建多少个V选项卡?,c++,vtable,C++,Vtable,对于上面的示例,将创建3个V.tables() 如果删除D1、D2中函数的virtual关键字,此代码还会创建3个v.tables吗?首先,如果成员函数在base中声明为virtual,则无论是否显式声明,它在所有派生类中都是virtual。(尽管它取决于实现) 其次,每个至少有一个函数的类都有一个且只有一个vtable。因此,对于您的问题,即使您从派生类函数中删除virtual,它们仍将保持虚拟,并且每个类将有三个vtable(在大多数实现中为一个)。@mat您的编辑遗漏了一些位,请参见我修复

对于上面的示例,将创建3个V.tables()


如果删除D1、D2中函数的virtual关键字,此代码还会创建3个v.tables吗?

首先,如果成员函数在base中声明为virtual,则无论是否显式声明,它在所有派生类中都是virtual。(尽管它取决于实现)


其次,每个至少有一个函数的类都有一个且只有一个vtable。因此,对于您的问题,即使您从派生类函数中删除virtual,它们仍将保持虚拟,并且每个类将有三个vtable(在大多数实现中为一个)。

@mat您的编辑遗漏了一些位,请参见我修复的其他内容vtables依赖于实现,而智能实现只会生成两个。这是因为
Base::vtable
可以重叠一个派生vtable。理论上的编译器甚至可以在这里创建一个vtable。C++标准没有提到VTABLE,在D2的VTABLE中有漏洞是完全可以的。
class Base
{
public:
    virtual void function1() {};
    virtual void function2() {};
};

class D1: public Base
{
public:
    virtual void function1() {};
};

class D2: public Base
{
public:
    virtual void function2() {};
};