Rumah > pembangunan bahagian belakang > C++ > Pengenalan kepada pelbagai masalah warisan dan penyelesaian dalam C++

Pengenalan kepada pelbagai masalah warisan dan penyelesaian dalam C++

WBOY
Lepaskan: 2023-10-09 21:41:21
asal
837 orang telah melayarinya

Pengenalan kepada pelbagai masalah warisan dan penyelesaian dalam C++

Pengenalan kepada masalah warisan berbilang dan penyelesaian dalam C++

Dalam C++, warisan berbilang ialah ciri berkuasa yang membolehkan kelas diperoleh daripada berbilang kelas induk. Walau bagaimanapun, pewarisan berbilang juga membawa beberapa masalah dan cabaran, yang paling biasa ialah Masalah Pewarisan Berlian.

Warisan berlian bermakna apabila kelas mewarisi daripada dua kelas induk yang berbeza pada masa yang sama, dan dua kelas induk mewarisi bersama daripada kelas asas yang sama, kelas terbitan akan mempunyai dua kejadian kelas asas yang sama. Akibatnya, apabila kelas terbitan memanggil fungsi ahli kelas asas atau mengakses pembolehubah ahli kelas asas, kekaburan berlaku dan pengkompil tidak dapat menentukan ahli kelas induk yang dipanggil.

Berikut ialah contoh khusus untuk menunjukkan masalah pewarisan berlian:

#include <iostream>

class Base {
public:
    void display() {
        std::cout << "Base class
";
    }
};

class LeftDerived : public Base {
};

class RightDerived : public Base {
};

class DiamondDerived : public LeftDerived, public RightDerived {
};

int main() {
    DiamondDerived d;
    d.display(); // 编译错误,二义性调用
    return 0;
}
Salin selepas log masuk

Dalam contoh di atas, kelas DiamondDerived berasal daripada LeftDerived dan RightDerived</ code> Kelas diwarisi secara berasingan dan kedua-dua kelas mewarisi daripada kelas <code>Base. Apabila kita mencipta objek d DiamondDerived dalam fungsi utama dan memanggil fungsi display, pengkompil tidak boleh Menentukan fungsi display kelas asas yang manakah harus dipanggil, sekali gus menghasilkan ralat kompilasi. DiamondDerived类从LeftDerivedRightDerived类分别继承而来,而这两个类都继承自Base类。当我们在main函数中创建一个DiamondDerived的对象d,并调用display函数时,编译器无法确定应该调用哪个基类的display函数,因此会产生编译错误。

解决菱形继承问题的常用方法是虚继承(Virtual Inheritance)。通过在继承关系中使用virtual关键字,可以确保派生类只继承一份基类的实例,而不是两份。

下面是使用虚继承修正菱形继承问题的代码示例:

#include <iostream>

class Base {
public:
    void display() {
        std::cout << "Base class
";
    }
};

class LeftDerived : virtual public Base {
};

class RightDerived : virtual public Base {
};

class DiamondDerived : public LeftDerived, public RightDerived {
};

int main() {
    DiamondDerived d;
    d.display(); // 正确调用 Base class
    return 0;
}
Salin selepas log masuk

在上面的代码中,我们在LeftDerivedRightDerived类的继承声明中使用了virtual关键字。这样一来,DiamondDerived类就只会继承一份Base类的实例,使得display

Cara biasa untuk menyelesaikan masalah pusaka berlian ialah pusaka maya (Virtual Inheritance). Dengan menggunakan kata kunci maya dalam perhubungan warisan, anda boleh memastikan bahawa kelas terbitan hanya mewarisi satu tika kelas asas, bukan dua.

Berikut ialah contoh kod yang menggunakan warisan maya untuk menyelesaikan masalah warisan berlian: 🎜rrreee🎜Dalam kod di atas, kami telah menggunakan dalam pengisytiharan warisan LeftDerived dan RightDerived mengelaskan kata kunci <kod>maya</kod>. Dengan cara ini, kelas DiamondDerived hanya akan mewarisi satu contoh kelas Base, menjadikan panggilan fungsi display tidak lagi samar-samar. 🎜🎜Ringkasnya, pewarisan berbilang ialah ciri yang berkuasa dalam C++, tetapi ia juga membawa masalah pewarisan berlian. Dengan menggunakan warisan maya, kita boleh menyelesaikan masalah ini dan memastikan bahawa kelas terbitan mewarisi hanya satu contoh kelas asas. Warisan maya ialah kaedah biasa untuk menangani masalah warisan berbilang, tetapi ia perlu dipertimbangkan dengan teliti semasa reka bentuk dan penggunaan untuk mengelak daripada memperkenalkan masalah baharu. 🎜

Atas ialah kandungan terperinci Pengenalan kepada pelbagai masalah warisan dan penyelesaian dalam C++. 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