Я понимаю, что наследование в форме ромба вызывает неоднозначность, и этого можно избежать, используя наследование через virtual Base Classes
, вопрос не в этом.Вопрос заключается в размере самого производного класса в иерархии ромбовидной формы, когда классы полиморфны.Вот пример кода и пример вывода:
#include<iostream>
using namespace std;
class Base
{
public:
virtual void doSomething(){}
};
class Derived1:public virtual Base
{
public:
virtual void doSomething(){}
};
class Derived2:public virtual Base
{
public:
virtual void doSomething(){}
};
class Derived3:public Derived1,public Derived2
{
public:
virtual void doSomething(){}
};
int main()
{
Base obj;
Derived1 objDerived1;
Derived2 objDerived2;
Derived3 objDerived3;
cout<<"\n Size of Base: "<<sizeof(obj);
cout<<"\n Size of Derived1: "<<sizeof(objDerived1);
cout<<"\n Size of Derived2: "<<sizeof(objDerived2);
cout<<"\n Size of Derived3: "<<sizeof(objDerived3);
return 0;
}
Вывод, который я получаю:
Size of Base: 4
Size of Derived1: 4
Size of Derived2: 4
Size of Derived3: 8
Как я понимаю, Base
содержит функцию виртуального члена и, следовательно,
sizeof Base = размер vptr = 4 в этой среде
Аналогично случаю Derived1
& Derived2
классов.
Вот мои вопросы, связанные с приведенным выше сценарием:
Како размере Derived3
объекта класса. Означает ли это, что класс Derived3 имеет 2 vptr?
Как класс Derived3
работает с этими 2 vptr. Какие-либо идеи относительно механизма, который он использует?
Размер классовоставлены как детали реализации компилятора и не определены Стандартом (поскольку сам виртуальный механизм является деталью реализации компиляторов)?