Ключевое
Виртуальный базовый класс в C++ используется для предотвращения множественного наследования и решения проблемы “алмаз смерти”. Он позволяет общим базовым классам в цепочке наследования существовать в единственном экземпляре.
Виртуальный базовый класс - это базовый класс, от которого наследуются другие классы через несколько уровней наследования, и он указан как виртуальный для предотвращения дублирования данных при множественном наследовании.
class VirtualBase {
public:
    int data;
    VirtualBase(int d) : data(d) {}
};
 
class Derived1 : virtual public VirtualBase {
public:
    Derived1(int d) : VirtualBase(d) {}
};
 
class Derived2 : virtual public VirtualBase {
public:
    Derived2(int d) : VirtualBase(d) {}
};
 
class MostDerived : public Derived1, public Derived2 {
public:
    MostDerived(int d) : VirtualBase(d), Derived1(d), Derived2(d) {}
};
 
int main() {
    MostDerived obj(42);
 
    // Обращение к общему виртуальному базовому классу через различные пути
    std::cout << "Derived1 data: " << obj.Derived1::data << std::endl; // Вывод: 42
    std::cout << "Derived2 data: " << obj.Derived2::data << std::endl; // Вывод: 42
    std::cout << "MostDerived data: " << obj.data << std::endl;        // Вывод: 42
 
    return 0;
}Особенности:
- Предотвращение дублирования: Виртуальные базовые классы позволяют общим базовым классам в иерархии наследования существовать в единственном экземпляре.
- Указание виртуальности: Ключевое слово virtualиспользуется при наследовании виртуального базового класса.
Применение:
- Используется для устранения “алмаза смерти”, когда в производном классе есть два пути наследования от одного и того же базового класса через разные промежуточные классы.
Замечания:
- Виртуальные базовые классы требуют явного указания при наследовании (virtualперед именем базового класса).
- Они позволяют избежать проблемы дублирования данных и неоднозначностей при множественном наследовании в сложных иерархиях классов.