Количество созданных 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 служит всем целям для одиночного наследования и виртуального наследования. Однако нет никаких гарантий, что это будет портативное поведение.