Количество созданных vptr, если производный класс также имеет виртуальную функцию, которой нет в Базовом классе - PullRequest
0 голосов
/ 03 апреля 2019
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 ]

1 голос
/ 03 апреля 2019

На моем GCC:

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

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

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

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

0 голосов
/ 04 апреля 2019

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

...