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

问题描述 投票:0回答:2
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”对象中继承。

c++ vtable vptr run-time-polymorphism
2个回答
1
投票

在我的GCC上:

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

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

derived类还有一个在Base类中不存在的虚函数

在从Derived继承的函数之后,Derived中添加的虚函数可能只是放在Base vtable的末尾。


0
投票

vtable / vptr问题是特定于平台的实现细节,std通常不涉及。我可以想象没有对象内部vptr的实现。但是在我知道的大多数平台上,只有一个vptr条目用于单继承和虚继承的所有目的。但是,不保证这是便携行为。

© www.soinside.com 2019 - 2024. All rights reserved.