Віртуальне успадкування () — в мові програмування C++, це один із варіантів успадкування. Він дозволяє розв'язати деякі проблеми множинного успадкування, зокрема «ромбоподібне успадкування». Віртуальне успадкування декларується словом virtual перед іменем базового класу.

Якщо при множинному успадкуванні серед базових класів є декілька екземплярів одного класу, що завжди успадковувався віртуально, то в похідному класі буде тільки одна копія даних такого класу.

В коді: class Animal { public: virtual void eat();

class Mammal : public Animal { public: virtual void breathe();

class WingedAnimal : public Animal { public: virtual void flap();

// A bat is a winged mammal class Bat : public Mammal, public WingedAnimal {

Bat bat;

Виклик bat.eat() є неоднозначним, оскільки компілятор не знає кого викликати: Mammal::Animal::eat() чи WingedAnimal::Animal::eat(). Насправді, це дві незалежні функції, кожну з яких можна викликати перетворюючи тип Bat до першого чи другого свого беспосереднього базового класу.

Також подібна неоднозначність буде при приведенні типу Bat до типу Animal, оскільки в кожному об'єкті Bat міститься два об'єкта Animal (по одному у Mammal та WingedAnimal).

Щоб уникнути такої незручної надлишковості, віртуальне успадкування зберігає тільки одну копію даних об'єкта Animal в об'єкті Bat, якщо Animal кожен раз був успадкований віртуально.

Примітки