Размер C ++ виртуальных классов наследования - PullRequest
0 голосов
/ 06 июня 2018

Вот мой код:

#include <iostream>
using namespace std;
class MyClass{
    int mem1;
    float mem2;
};
class MyKids: public virtual MyClass{
    int cmem1;
    int cmem2;
};
class MyLawKids:public virtual MyClass{
    int lmem1;
};
class MyGrands:public MyKids, public MyLawKids{
    int gmem1;
};

int main(){
    cout << "\n Size of MyClass: " << sizeof(MyClass) << " bytes" << endl ;
    cout << " Size of MyKids: " << sizeof(MyKids) << " bytes" << endl ;
    cout << " Size of MyLawKids: " << sizeof(MyLawKids) << " bytes" << endl ;
    cout << " Size of MyGrands: " << sizeof(MyGrands) << " bytes" << endl ;
    return 0;
}

Результат:

 Size of MyClass: 8 bytes
 Size of MyKids: 20 bytes
 Size of MyLawKids: 16 bytes
 Size of MyGrands: 32 bytes

Process returned 0 (0x0)   execution time : 0.094 s
Press any key to continue.

Я думаю, что размер класса MyGrands должен быть 36 байтов = (sizeof (MyKids + MyLawKids + int gmem1)) - 4 байта указателя виртуальной таблицы).

Почему мой результат показал мне "Размер MyGrands: 32 байта"?

1 Ответ

0 голосов
/ 06 июня 2018

MyGrands содержит только один экземпляр MyClass, поскольку MyKids и MyLawKids фактически наследуют от MyClass.Следовательно, ваш расчет неверен, считая дважды MyClass.Кстати, в общем, вы не должны полагаться на наивное добавление частей, равных размеру целого.Компилятор может добавить отступы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...