Я не берусь за вывод, показанный ниже.
Я знаю, что всякий раз, когда присутствует виртуальная функция, она создает vptr
но размер печати больше, чем я ожидал:
#include<iostream>
using namespace std;
class Base
{
int x;
int y;
int z;
public:
virtual void fun(){}
virtual void fun2(){}
};
class Derived:public Base
{
public:
void fun() override {}
};
int main(int argc, char const *argv[])
{
cout<<sizeof(Base)<<endl;
cout<<sizeof(Derived)<<endl;
cout<<sizeof(int)<<endl;
}
24
24
4
[Закончено за 0,3 с]
Это 64-битная сборка? Если так, sizeof Base
было бы:
8 (указатель vtable) + (3 * 4 = 12) (переменные-члены) + 4 (добавление к кратному 8 байтов)
= 24
поскольку Derived
происходит только от Base
и не добавляет переменных-членов, его размер такой же.
Почему добавлены отступы? Для поддержания 8-байтового выравнивания в массивах и в стеке. Почему это важно? Это другой вопрос.
Других решений пока нет …