Виртуално наследяване от базов клас

AFAIK, виртуалното наследяване решава проблема с диаманта, но какво ще стане, ако използвам виртуално просто за наследяване от базов клас? Каква е разликата с използването на virtual тук?

class A 
{
    /* ... */
};

class B : virtual public A
{
    /* ... */
};

person user1086635    schedule 01.01.2012    source източник


Отговори (1)


Има няколко разлики. Оформлението на обекта ще бъде различно (в случай на виртуално наследяване ще има допълнителен скрит указател към основата в извлечения подобект), инициализацията на подобектите ще се различава (тип, произлизащ от B, ще трябва да извика конструктора A директно в списъка за инициализация). Всеки код в B членски функции, който препраща към A членове (данни или функции), ще изисква допълнителна индиректност (чрез указателя, споменат по-горе), и евентуално други разлики.

Виртуалното наследяване е сложен въпрос и вероятно трябва да прочетете повече от връзките, предоставени в отговорите на предишния ви въпрос, отколкото да се опитвате да го разберете, като просто получавате части от отделни въпроси.

Съвет: Ако искате да разберете подробностите за това как виртуалното наследяване се обработва от компилатора, трябва да се съсредоточите върху оформлението на паметта на обектите. След като разберете защо е необходим допълнителен указател за клас, който виртуално произлиза, останалото е просто.

person David Rodríguez - dribeas    schedule 01.01.2012