Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Warisan Maya Menyelesaikan Masalah Kekaburan Warisan Berbilang?

Bagaimanakah Warisan Maya Menyelesaikan Masalah Kekaburan Warisan Berbilang?

Patricia Arquette
Lepaskan: 2024-12-16 20:14:16
asal
686 orang telah melayarinya

How Does Virtual Inheritance Solve the Multiple Inheritance Ambiguity Problem?

Menyelesaikan Kekaburan Warisan Berbilang dengan Warisan Maya

Dalam pengaturcaraan berorientasikan objek, warisan berbilang boleh membawa kepada konflik yang dikenali sebagai "masalah berlian" apabila kelas mewarisi daripada berbilang kelas induk yang mempunyai kelas asas biasa. Ini boleh mengakibatkan kekaburan dalam menyelesaikan pelaksanaan kaedah yang diwarisi untuk dipanggil.

Warisan maya ialah ciri bahasa yang direka khusus untuk menangani isu ini. Dengan mengisytiharkan kelas asas sebagai awam maya, anda menunjukkan bahawa terdapat hanya satu contoh kelas asas itu, tanpa mengira bilangan laluan yang diwarisi.

Untuk menggambarkan ini, pertimbangkan kod berikut:

class A {
public:
    void eat() { cout << "A"; }
};

class B : virtual public A {
public:
    void eat() { cout << "B"; }
};

class C : virtual public A {
public:
    void eat() { cout << "C"; }
};

class D : public B, C {
public:
    void eat() { cout << "D"; }
};

int main() {
    A *a = new D();
    a->eat();
}
Salin selepas log masuk

Dalam contoh ini, kelas D mewarisi daripada kedua-dua B dan C, yang seterusnya mewarisi daripada kelas asas biasa A. Tanpa maya warisan, akan ada dua laluan dari D ke A:

D -> B -> A
D -> C -> A
Salin selepas log masuk

Memanggil a->eat() akan mengakibatkan kekaburan kerana pengkompil tidak dapat menentukan laluan yang harus diikuti. Walau bagaimanapun, dengan pewarisan maya, perkara berikut berlaku:

  • Hanya satu tika A dicipta, tanpa mengira dua laluan dari D ke A.
  • Saiz objek D bertambah untuk menampung dua penunjuk jadual maya, satu untuk warisan maya B bagi A dan satu untuk warisan maya C bagi A.
  • Laluan B::A dan C::A menjadi sama, menghapuskan kekaburan.

Oleh itu, apabila a->eat() dipanggil, kaedah daripada kelas asas kongsi A digunakan, menghasilkan output "A." Ini dicapai kerana warisan maya memastikan bahawa hanya terdapat satu contoh kelas asas, menghapuskan kekaburan dalam panggilan kaedah.

Atas ialah kandungan terperinci Bagaimanakah Warisan Maya Menyelesaikan Masalah Kekaburan Warisan Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan