Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang fungsi ahli C++: warisan maya dan masalah berlian kaedah objek

Penjelasan terperinci tentang fungsi ahli C++: warisan maya dan masalah berlian kaedah objek

WBOY
WBOYasal
2024-04-29 16:36:01829semak imbas

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.

C++ 成员函数详解:对象方法的虚继承与钻石问题

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 类将从 CatDog 类分别继承一个 makeSound() 方法。然而,这会导致在调用 makeSound() 方法时产生歧义,因为 Siamese 类中存在两个同名方法。

解决钻石问题:

为了解决钻石问题,我们可以使用虚继承。在虚继承中,派生类不会获得基类的实际副本,而是通过一个指针间接访问基类的方法。

要使用虚继承,请在派生类继承规范中使用 virtual 关键字:

class Siamese : public virtual Cat, public virtual Dog {
};

这样,Siamese 类将只获得一个 makeSound() 方法,该方法来自最终从 Animal 类中派生的类 (CatDog 中的一个)。

输出:

Siamese siamese;
siamese.makeSound(); // Cat meows

在上面的示例中,Siamese 类从 Cat 类继承了 makeSound() 方法,因为它是第一个从 Animal

🎜Menyelesaikan masalah berlian: 🎜🎜🎜Untuk menyelesaikan masalah berlian, kita boleh menggunakan warisan maya. Dalam warisan maya, kelas terbitan tidak memperoleh salinan sebenar kelas asas, tetapi secara tidak langsung mengakses kaedah kelas asas melalui penunjuk. 🎜🎜Untuk menggunakan warisan maya, sila gunakan kata kunci maya dalam spesifikasi warisan kelas terbitan: 🎜rrreee🎜Dengan cara ini, kelas Siam hanya akan mendapat satu kaedah makeSound() daripada kelas yang akhirnya berasal daripada kelas 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn