Наличие VPTR у подобъектов
У меня есть класс 'base' с виртуальным деструктором и, следовательно, с VTable и соответствующим VTPR в нем, и класс, производный от него:
class base {
public:
virtual ~base() {}
};
class der : base {};
main()
{
int a = sizeof(base); // = 4 , fine !
int b = sizeof(der); // = 4 too ?
}
Теперь, поскольку производный класс также является виртуальным, он будет иметь собственный VPTR, но так как он также имеет подобъект базового класса с VPTR в нем, размер класса der не должен быть 8 байтов, т.е. размер VPTR класса 'der' + размер VPTR подобъекта класса 'base'? (когда sizeof(void*) = 4 байта).
Итак, в основном мой вопрос: когда субобъект класса 'base' сделан в 'der', у него есть отдельный новый VPTR? И если это так, то почему его размер не добавляется при расчете размера 'der'?
Может кто-нибудь, пожалуйста, уточнить это.
2 ответа
Это все зависит от реализации. Но на практике в производном классе будет только один vptr; нет необходимости для двоих. Весь смысл vptr в том, что он используется для динамического вызова корректного переопределения виртуальной функции; der
объекты просто будут иметь другое значение указателя base
объекты.
[Примечание: ваш пример, вероятно, смущен тем фактом, что вы (непреднамеренно?) Используете частное наследование, а не более типичное публичное наследование...]
Я думаю, что вы путаете vtables и vptrs. Каждый класс будет иметь vtable, и каждый объект будет хранить указатель на свою vtable как vptr. Vtable похож на статический глобал, он разделяется между всеми экземплярами класса и, следовательно, не занимает места в объекте.