Я понимаю, что Ромбовидное наследование вызывает неоднозначность и его можно избежать, используя наследование через 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, есть идеи о механизме этого использует?
Классы sizeof оставлены как деталь реализации компилятора и не определены стандартом (поскольку сам виртуальный механизм является деталью реализации компиляторов)?
sizeof
также является деталями реализации, он особенно зависит от размера указателя, если бы вы работали на 64-битной платформе, вы бы увидели8/8/8/16
. - person Matthieu M.   schedule 31.03.2011