Rumah > Artikel > pembangunan bahagian belakang > Apakah kesan kelebihan beban fungsi C++ dalam pelbagai warisan?
Dalam pewarisan berbilang, kelebihan beban fungsi dalam kelas terbitan mengakibatkan menyembunyikan atau mengatasi fungsi kelas asas, bergantung pada sama ada tandatangan adalah sama. Struktur warisan berlian boleh membawa kepada kekaburan kerana kelas terbitan tidak tahu fungsi kelas asas yang hendak dipanggil. Kekaburan boleh diselesaikan menggunakan penyelesai skop eksplisit, penukaran jenis atau warisan maya.
Pewarisan berbilang dalam C++ membolehkan kelas terbitan mewarisi daripada berbilang kelas asas Apabila fungsi dengan nama yang sama dengan kelas asas ditakrifkan dalam kelas terbitan, ia dipanggil overloading fungsi. Fungsi lebihan mempunyai kesan khusus dalam pelbagai warisan.
Apabila kelas terbitan mentakrifkan semula fungsi dalam kelas asas, ia boleh menyembunyikan atau mengatasi fungsi itu. Jika tandatangan fungsi kelas terbitan adalah sama dengan fungsi kelas asas, fungsi itu akan diganti jika tandatangan fungsi kelas terbitan berbeza, fungsi kelas asas disembunyikan.
class Base1 { public: void print() { cout << "Base1" << endl; } }; class Base2 { public: void print(int x) { cout << "Base2 " << x << endl; } }; class Derived : public Base1, public Base2 { public: void print() { cout << "Derived" << endl; } // 覆盖 Base1::print() }; int main() { Derived d; d.print(); // 输出 "Derived" d.print(5); // 输出 "Base2 5" }
Warisan berbilang boleh membentuk struktur warisan berlian, di mana kelas mewarisi dari kelas asas yang sama beberapa kali. Keadaan ini membawa kepada kekaburan dalam kelebihan beban fungsi kerana kelas terbitan tidak tahu fungsi kelas asas yang hendak dipanggil.
class Base { public: void print() { cout << "Base" << endl; } }; class Derived1 : public Base { public: void print() { cout << "Derived1" << endl; } // 覆盖 Base::print() }; class Derived2 : public Base { public: void print() { cout << "Derived2" << endl; } // 覆盖 Base::print() }; class GrandChild : public Derived1, public Derived2 { public: void print() { } // 编译错误:歧义,不知道调用 Derived1::print() 还是 Derived2::print() };
Untuk menyelesaikan kekaburan tentang kelebihan beban fungsi dalam berbilang warisan, anda boleh menggunakan kaedah berikut:
Base::explicitmely fungsi kelas asas untuk memanggil. <code>Base::functionName
显式指定要调用的基类函数。
virtual
Atas ialah kandungan terperinci Apakah kesan kelebihan beban fungsi C++ dalam pelbagai warisan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!