Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menangani kekaburan dalam warisan?

Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menangani kekaburan dalam warisan?

PHPz
PHPzasal
2024-04-30 15:51:021154semak imbas

Selesaikan kekaburan dalam warisan Apabila terdapat fungsi dengan nama yang sama, anda boleh menyelesaikan kekaburan dengan menggunakan kaedah berikut: gunakan penyelesai skop (::) untuk menentukan kelas yang dimiliki oleh fungsi tersebut. Gantikan fungsi kelas asas dalam kelas terbitan. Cipta penuding kelas asas kepada objek kelas terbitan dan kemudian gunakan penuding untuk memanggil fungsi kelas asas.

C++ 函数继承详解:如何处理继承中出现的二义性?

Penjelasan terperinci pewarisan fungsi C++: menangani kekaburan dalam pewarisan

Kekaburan dalam pewarisan

Apabila kelas asas dan kelas terbitan mempunyai fungsi dengan nama yang sama, kekaburan dalam pewarisan akan berlaku apabila kelas asas dan kelas terbitan mempunyai fungsi dengan nama yang sama, fungsi penyalahgunaan akan berlaku dalam soalan. Ini kerana pengkompil tidak dapat menentukan versi fungsi yang hendak dipanggil.

Menyelesaikan kekaburan

Terdapat beberapa cara untuk menyelesaikan kekaburan dalam warisan:

  1. Menggunakan penyelesai skop : Gunakan penyelesai skop (::) untuk menentukan kelas yang anda gunakan untuk memanggil fungsi tersebut.

    class Base {
    public:
     void func() { std::cout << "Base::func()" << std::endl; }
    };
    
    class Derived : public Base {
    public:
     void func() { std::cout << "Derived::func()" << std::endl; }
    
     void callBaseFunc() {
         Base::func();  // 使用作用域解析符调用基类函数
     }
    };
  2. Timpa fungsi kelas asas: Gantikan fungsi kelas asas dalam kelas terbitan.

    class Base {
    public:
     virtual void func() { std::cout << "Base::func()" << std::endl; }
    };
    
    class Derived : public Base {
    public:
     void func() override { std::cout << "Derived::func()" << std::endl; }
    };
  3. Gunakan penunjuk kelas asas: Buat penunjuk kelas asas dan tuding ke objek kelas terbitan. Kemudian, gunakan penuding untuk memanggil fungsi kelas asas.

    class Base {
    public:
     void func() { std::cout << "Base::func()" << std::endl; }
    };
    
    class Derived : public Base {
    public:
     void func() { std::cout << "Derived::func()" << std::endl; }
    };
    
    int main() {
     Base* basePtr = new Derived;
     basePtr->func();  // 调用基类函数
     return 0;
    }

Kes praktikal

Pertimbangkan kod berikut:

class Animal {
public:
    void speak() { std::cout << "Animal speaks" << std::endl; }
};

class Dog : public Animal {
public:
    void speak() { std::cout << "Dog barks" << std::endl; }
};

class Cat : public Animal {
public:
    void speak() { std::cout << "Cat meows" << std::endl; }
};

int main() {
    Animal* animal = new Dog;     // 创建指向 Dog 对象的 Animal 指针
    animal->speak();              // 调用 Dog::speak()
    animal = new Cat;            // 创建指向 Cat 对象的 Animal 指针
    animal->speak();              // 调用 Cat::speak()
    return 0;
}

Dalam contoh ini, menggunakan penunjuk kelas asas boleh menyelesaikan masalah kekaburan. Kita boleh mengakses fungsi tertentu dari kelas terbitan yang berbeza tanpa sebarang pengubahsuaian eksplisit kepada kod tersebut.

Kesimpulan

Memahami kekaburan dalam warisan dan mengetahui cara menyelesaikannya adalah penting untuk menulis kod C++ yang mantap dan boleh diselenggara. Dengan menggunakan teknik yang diberikan, anda boleh dengan mudah mengendalikan kekaburan dan memastikan fungsi yang betul dipanggil.

Atas ialah kandungan terperinci Penjelasan terperinci tentang warisan fungsi C++: Bagaimana untuk menangani kekaburan dalam warisan?. 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