Виртуальный базовый класс в C++
Ключевое слово virtual перед
public-наследованием превращает общего
предка в виртуальную базу: копия
одна на весь ромб.
Обе промежуточные ветки ссылаются на тот
же подобъект, поэтому адрес части
Base совпадает, с какой стороны
к объекту ни обращались. Повторим схему
с virtual public Base и выведем
два адреса:
#include <iostream>
class Base {};
class Left : virtual public Base {};
class Right : virtual 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;
}
Сделайте виртуальный ромб с пустым
Base. Сравните два адреса части
Base через левую и правую ветку
и выведите same, если они
совпали, иначе diff.
Добавьте в Base поле int tag
и задайте его в конструкторе нижнего
класса. Выведите tag через ссылку
на Left и через ссылку на
Right - числа должны совпасть.