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

WBOY
Lepaskan: 2024-04-29 16:36:01
asal
812 orang telah melayarinya

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 { // 钻石问题
};
Salin selepas log masuk

Mengikut peraturan pewarisan biasa, kelas Siam akan diperoleh daripada Cat dan Dog </code > Setiap kelas mewarisi kaedah <code>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 {
};
Salin selepas log masuk

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

输出:

Siamese siamese;
siamese.makeSound(); // Cat meows
Salin selepas log masuk

在上面的示例中,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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!