Rumah > Artikel > pembangunan bahagian belakang > Penjelasan terperinci tentang fungsi ahli C++: warisan maya dan masalah berlian kaedah objek
Warisan maya menyelesaikan "masalah berlian" dalam berbilang warisan, apabila kelas mewarisi daripada dua atau lebih subkelas dengan kelas asas yang sama. Dengan menggunakan kata kunci maya dalam spesifikasi pewarisan kelas terbitan, kelas terbitan tidak mendapat salinan kelas asas, sebaliknya mengakses kaedah kelas asas secara tidak langsung melalui penunjuk. Dengan cara ini, kelas terbitan hanya mendapat satu kaedah daripada kelas yang akhirnya terbit daripada kelas asas, sekali gus mengelakkan kekaburan.
Penjelasan terperinci tentang fungsi ahli C++: warisan maya dan masalah berlian kaedah objek
Warisan maya ialah mekanisme pewarisan yang menyelesaikan "masalah berlian" dalam pewarisan berbilang. Masalah berlian berlaku apabila kelas secara serentak mewarisi daripada dua atau lebih subkelas yang mempunyai kelas asas yang sama.
Contoh Praktikal:
Pertimbangkan coretan kod berikut:
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 { // 钻石问题 };
Mengikut peraturan pewarisan biasa, kelas Siam
akan diperoleh daripada Cat
dan Dog
Setiap kelas mewarisi kaedah makeSound()
. Walau bagaimanapun, ini membawa kepada kekaburan apabila memanggil kaedah makeSound()
, kerana terdapat dua kaedah dengan nama yang sama dalam kelas Siam
. 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
Animal
(sama ada Cat
atau Dog
). 🎜🎜🎜Output: 🎜🎜rrreee🎜Dalam contoh di atas, kelas Siam
mewarisi kaedah makeSound()
daripada kelas Cat
kerana ia Adakah kelas asas pertama diperoleh daripada kelas Animal
. 🎜Atas ialah kandungan terperinci Penjelasan terperinci tentang fungsi ahli C++: warisan maya dan masalah berlian kaedah objek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!