public-наследованием превращает общего предка в виртуальную базу: копия одна на весь ромб.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
493 of 696 menu
◀ ▶

Виртуальный базовый класс в C++

Ключевое слово virtual перед public-наследованием превращает общего предка в виртуальную базу: копия одна на весь ромб.

Обе промежуточные ветки ссылаются на тот же подобъект, поэтому адрес части Base совпадает, с какой стороны к объекту ни обращались. Повторим схему с virtual public Base и выведем два адреса:

┌pPathX="main.cpp" #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 - числа должны совпасть.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить