Введение к ромбовидному наследованию в C++
Ромбовидная схема возникает, когда два родителя делят общего предка, а снизу их соединяет один класс.
При обычном public-наследовании без ключевого
слова virtual каждая ветка приносит
свою копию предка. В объекте оказываются
две независимые части Base, и адреса
этих частей различаются. Соберем схему
и выведем два адреса:
┌pPathX="main.cpp"
#include <iostream>
class Base {};
class Left : public Base {};
class Right : public Base {};
class Bottom : public Left, public Right {};
int main() {
Bottom item;
Left& viaLeft = item;
Right& viaRight = item;
std::cout << static_cast<void*>(static_cast<Base*>(&viaLeft))
<< "\n";
std::cout << static_cast<void*>(static_cast<Base*>(&viaRight))
<< "\n";
return 0;
}
Строки на экране не совпадают: в памяти лежат две подобъектные копии одного и того же базового типа.