Ключевое

Виртуальный базовый класс в 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 перед именем базового класса).
  • Они позволяют избежать проблемы дублирования данных и неоднозначностей при множественном наследовании в сложных иерархиях классов.