如果派生类还具有基类中不存在的虚函数,则创建的vptr的数量

时间:2019-04-03 09:57:12

标签: c++ vtable vptr run-time-polymorphism

class Base
{
    public:

    virtual void func1()
    {
        std::cout<<"Base func1"<<std::endl;
    }
   //virtual destructor

};

class Derived : public Base
{
    public:

    virtual void func1()
    {
        std::cout<<"Derived Base func1"<<std::endl;
    }

    virtual void func2()
    {
        std::cout<<"Derived func2"<<std::endl;
    }
};


int main()
{
    Derived *d = new Derived;
    delete d;
}

我想知道是否创建了两个用于解析虚拟函数的“ vptr”,一个在“ Base”类中,它将在func1()的Derived类对象中继承,另一个在func2的“ Derived”对象中继承()。

2 个答案:

答案 0 :(得分:1)

在我的海湾合作委员会上:

std::cout << sizeof(void*) << ' ' << sizeof(Derived) << '\n';
// Prints 8 8

因此一个vtable指针就足够了。我希望大多数其他编译器的行为相同。

  

派生类还具有基类中不存在的虚函数

Derived中继承的函数之后,可能会简单地将Derived中添加的虚拟函数放在Base vtable的末尾。

答案 1 :(得分:0)

vtable / vptr问题是特定于平台的实现细节,std通常不会涵盖。我可以想象完全没有对象内vptr的实现。但是我知道,在大多数平台上,只有一个vptr条目可以满足单一继承和虚拟继承的所有目的。但是,不能保证此行为是可移植的行为。