#include<iostream>
using namespace std;
class A
{
virtual void fun() {}
};
class B
{
virtual void fun2() {}
};
class C : virtual public A, virtual public B
{
public:
virtual void fun3() {}
};
int main()
{
/**
* why is the size of C 16 and not 24?
*/
cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C);
return 0;
}
Я не понимаю, почему размер C равен 16, а не 24. Если он наследует виртуальные указатели как класса A, так и B, то почему у него нет собственного виртуального указателя?
C
наследует указатели на vtable отA
иB
и имеет указатель на свою собственную vtable, почему размер не 3 указателя (24 байта в этом кейс). По этой причине компилятор может расширить унаследованную vtable, поэтому классC
по-прежнему имеет только 2 указателя на vtables,A
иB
, но к одному из них добавлена другая виртуальная функция (fun3
). Источник: как определить класс sizeof с виртуальными функциями? - person user1810087   schedule 30.06.2020A
, иB
имеют одну виртуальную функцию, и помещает указатель дляfun3()
в свободное пространство в одном или обоих унаследованных vtables. В конце концов, код, который используетC
(например, вызываетobject->fun3()
, гдеobject
указывает на экземплярC
или класс, производный отC
), показывает, чтоC
имеет две базы, каждая из которых имеет только одну виртуальную функцию. - person Peter   schedule 30.06.2020