Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung der C++-Memberfunktionen: virtuelle Vererbung und Diamantproblem von Objektmethoden
Virtuelle Vererbung löst das „Diamantproblem“ bei der Mehrfachvererbung, wenn eine Klasse von zwei oder mehr Unterklassen mit derselben Basisklasse erbt. Durch die Verwendung des Schlüsselworts virtual in der Vererbungsspezifikation einer abgeleiteten Klasse erhält die abgeleitete Klasse keine Kopie der Basisklasse, sondern greift stattdessen indirekt über Zeiger auf die Methoden der Basisklasse zu. Auf diese Weise erhält die abgeleitete Klasse nur eine Methode von der Klasse, die letztendlich von der Basisklasse abgeleitet ist, wodurch Mehrdeutigkeiten vermieden werden.
Detaillierte Erklärung der C++-Memberfunktionen: virtuelle Vererbung und Diamantproblem von Objektmethoden
Virtuelle Vererbung ist ein Vererbungsmechanismus, der das „Diamantproblem“ bei der Mehrfachvererbung löst. Das Diamantproblem tritt auf, wenn eine Klasse gleichzeitig von zwei oder mehr Unterklassen erbt, die dieselbe Basisklasse haben.
Praktisches Beispiel:
Betrachten Sie den folgenden Codeausschnitt:
class Animal { public: virtual void makeSound() { cout << "Animal makes a sound" << endl; } }; class Cat : public Animal { public: virtual void makeSound() { cout << "Cat meows" << endl; } }; class Dog : public Animal { public: virtual void makeSound() { cout << "Dog barks" << endl; } }; class Siamese : public Cat, public Dog { // 钻石问题 };
Nach den normalen Vererbungsregeln wird die Klasse Siamese
von Cat
und Dog abgeleitet
Jede Klasse erbt eine makeSound()
-Methode. Dies führt jedoch zu Mehrdeutigkeiten beim Aufruf der Methode makeSound()
, da es in der Klasse Siamese
zwei Methoden mit demselben Namen gibt. Siamese
类将从 Cat
和 Dog
类分别继承一个 makeSound()
方法。然而,这会导致在调用 makeSound()
方法时产生歧义,因为 Siamese
类中存在两个同名方法。
解决钻石问题:
为了解决钻石问题,我们可以使用虚继承。在虚继承中,派生类不会获得基类的实际副本,而是通过一个指针间接访问基类的方法。
要使用虚继承,请在派生类继承规范中使用 virtual
关键字:
class Siamese : public virtual Cat, public virtual Dog { };
这样,Siamese
类将只获得一个 makeSound()
方法,该方法来自最终从 Animal
类中派生的类 (Cat
或 Dog
中的一个)。
输出:
Siamese siamese; siamese.makeSound(); // Cat meows
在上面的示例中,Siamese
类从 Cat
类继承了 makeSound()
方法,因为它是第一个从 Animal
virtual
in der Vererbungsspezifikation der abgeleiteten Klasse: 🎜rrreee🎜Auf diese Weise erhält die Klasse Siamese
nur einen makeSound()
-Methode aus einer Klasse, die letztendlich von der Klasse Animal
abgeleitet ist (entweder Cat
oder Dog
). 🎜🎜🎜Ausgabe: 🎜🎜rrreee🎜Im obigen Beispiel erbt die Klasse Siamese
die Methode makeSound()
von der Klasse Cat
, weil sie Ist die erste Basisklasse, die von der Klasse Animal
abgeleitet ist. 🎜Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der C++-Memberfunktionen: virtuelle Vererbung und Diamantproblem von Objektmethoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!