class Base{}class IFace1{ virtual int f() {}}class IFace2{ virtual int g() {}}class Derived : public Base, IFace1, IFace2{ virtual int f() {} virtual int g() {}}void h(){ Base *o = new Derived; IFace1 *o1 = (IFace1*)o; // ok, vtable совпадают, тк у Base нет вирт ф-ий IFace2 *o2 = (IFace2*)o; // fail, мы читаем vtable 1го класса, а должны 2го}
C++ (Qt) Derived *o = new Derived; // вмещающий класс IFace1 *o1 = dynamiс_cast <IFace1*> (o); // здесь С приведение имеет тот же эффект IFace2 *o2 = dynamiс_cast <IFace2*> (o); // здесь тоже ... IFace1 *o3 = dynamiс_cast <IFace1*> (o2); // а здесь С приведение даст неверный результат}
C++ (Qt)void h(){ Derived*o = new Derived; Base*b = (Base*)o; IFace1 *o1 = (IFace1*)o; IFace2 *o2 = (IFace2*)o;}
C++ (Qt) Base * b = new Derived(); IFace1 *o1 = (IFace1*) b; IFace2 *o2 = (IFace2*) b;}