Размер класса, полученного из нескольких унаследованных классов с виртуальной функцией

Рассмотрим алмазный сценарий ниже:

class Base {
int x;
public:
virtual ~Base(){}
};

class Derived1 : virtual public Base {
int y;
};

class Derived2 : virtual public Base {
int z;
};

class Derived3 : public Derived1, public Derived2 {
int t;
};
  • Размер База является 8 [x (4) + vptr (4) (из виртуального деструктора)]
  • Размер Derived1 является 16 [x (4) + y (4) + vptr (4) (из виртуального деструктора) + vptr (4) (из виртуального наследования)]
  • Размер Derived2 является 16 [x (4) + z (4) + vptr (4) (из виртуального деструктора) + vptr (4) (из виртуального наследования)]
  • Размер Derived3 является 28 [x (4) + y (4) + z (4) + t (4) + vptr (4) (от виртуального деструктора) + 2 раза vptr (4) (от виртуального наследования Derived1 и Derived2)]

Теперь, если я добавлю еще один класс Derived4 который вытекает из Производная 3,

class Derived4 : public Derived3 {
int s;
};

это размер выходит 32 (который я предполагаю быть размер Derived3 + s).

Я хочу знать, если внутри нет виртуального указателя Derived4?

Если я возьму нормальную иерархию классов (без алмазной структуры), то если базовый класс имеет виртуальную функцию, то все производные классы имеют vptrs. Так почему бы не в этом случае?

Я компилирую код в codeBlocks 12.11 с помощью компилятора GNU GCC.

2

Решение

Поскольку Derived4 не добавил никаких виртуальных функций или виртуальных базовых классов, помимо того, что он унаследовал от Derived3, единственное увеличение в размере относится к элементам s.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector