Топ питань
Часова шкала
Чат
Перспективи
Віртуальне успадкування
З Вікіпедії, вільної енциклопедії
Remove ads
Віртуальне успадкування (англ. virtual inheritance) — в мові програмування C++, це один із варіантів успадкування. Він дозволяє розв'язати деякі проблеми множинного успадкування, зокрема «ромбоподібне успадкування».[1][2]
Віртуальне успадкування декларується словом 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
кожен раз був успадкований віртуально.
Remove ads
Примітки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads