Количество созданных vptr, если производный класс также имеет виртуальную функцию, которой нет в Базовом классе

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", который будет унаследован в объекте класса Derived для func1(), и другой в объекте "Derived" для func2().

2 ответа

На моем GCC:

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

Так что одного указателя vtable достаточно. Я ожидаю, что большинство других компиляторов будут вести себя так же.

производный класс также имеет виртуальную функцию, которой нет в базовом классе

Виртуальные функции добавлены в Derived вероятно, просто помещены в конце Derived vtable, после функций, унаследованных от Base,

Проблемы vtable/vptr - это детали реализации для конкретной платформы, которые обычно не рассматриваются в std. Я могу представить себе реализации без какого-либо in-object vptr. Но на большинстве платформ, которые я знаю, ровно одна запись vptr служит всем целям для одиночного наследования и виртуального наследования. Однако нет никаких гарантий, что это будет портативное поведение.

Другие вопросы по тегам