#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
). Източник: как да се определи размерът на класа с виртуални функции? - person user1810087   schedule 30.06.2020A
иB
имат една единствена виртуална функция и прибира указателя заfun3()
в свободно пространство в една или и двете от наследените vtables. В крайна сметка кодът, който използваC
(например извикваobject->fun3()
, къдетоobject
сочи към екземпляр наC
или клас, извлечен отC
), има видимост, чеC
има две бази, всяка от които има само една виртуална функция. - person Peter   schedule 30.06.2020