Віртуальне успадкування

Віртуальне успадкування (англ. 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 кожен раз був успадкований віртуально.

Примітки

  1. Andrei Milea. Solving the Diamond Problem with Virtual Inheritance. http://www.cprogramming.com/: Cprogramming.com. Процитовано 8 березня 2010. «One of the problems that arises due to multiple inheritance is the diamond problem. A classical illustration of this is given by Bjarne Stroustrup (the creator of C++) in the following example:»
  2. Ralph McArdell (14 лютого 2004). C++/What is virtual inheritance?. http://en.allexperts.com/: All Experts. Архів оригіналу за 10 січня 2010. Процитовано 8 березня 2010.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.