Rumah > pembangunan bahagian belakang > C++ > Perbincangan isu dan penyelesaian pelaksanaan polimorfisme dalam C++

Perbincangan isu dan penyelesaian pelaksanaan polimorfisme dalam C++

王林
Lepaskan: 2023-10-09 16:17:06
asal
879 orang telah melayarinya

Perbincangan isu dan penyelesaian pelaksanaan polimorfisme dalam C++

Perbincangan tentang isu dan penyelesaian pelaksanaan polimorfisme dalam C++

Polymorfisme ialah ciri yang sangat penting dalam bahasa C++, yang membolehkan objek kelas mempamerkan gelagat yang berbeza mengikut jenis khusus mereka. Walau bagaimanapun, dalam aplikasi sebenar, kadangkala kita menghadapi beberapa masalah, terutamanya dalam senario penggunaan pelbagai warisan dan pemusnah maya.

1. Pelaksanaan polimorfisme
Dalam C++, polimorfisme boleh dicapai melalui fungsi maya dan fungsi maya tulen. Fungsi maya ditakrifkan dalam kelas asas dan diisytiharkan melalui kata kunci "maya" boleh mengatasi fungsi ini untuk melaksanakan tingkah laku tertentu. Fungsi maya tulen hanya diisytiharkan dalam kelas asas tanpa pelaksanaan khusus mesti mengatasi fungsi ini.

#include <iostream>
using namespace std;

class Animal {
public:
   virtual void sound() {
      cout << "动物发出声音" << endl;
   }
};

class Cat : public Animal {
public:
   void sound() {
      cout << "猫咪发出喵喵声" << endl;
   }
};

class Dog : public Animal {
public:
   void sound() {
      cout << "狗狗发出汪汪声" << endl;
   }
};

int main() {
   Animal *animal1 = new Cat;
   Animal *animal2 = new Dog;
   animal1->sound();  // 输出:猫咪发出喵喵声
   animal2->sound();  // 输出:狗狗发出汪汪声
   return 0;
}
Salin selepas log masuk

Dalam kod di atas, Haiwan ialah kelas asas dan Kucing dan Anjing ialah kelas terbitan. Dengan mentakrifkan bunyi fungsi maya(), kesan polimorfisme dicapai. Pada masa jalanan, dengan mengisytiharkan penunjuk kelas asas untuk menunjuk ke objek kelas terbitan, fungsi sound() subkelas dipanggil.

2. Masalah yang disebabkan oleh pewarisan berbilang
C++ menyokong pewarisan berbilang, iaitu, kelas terbitan boleh mewarisi daripada berbilang kelas asas pada masa yang sama. Walau bagaimanapun, warisan berbilang boleh menyebabkan kekaburan dalam panggilan fungsi.

#include <iostream>
using namespace std;

class Animal {
public:
   virtual void sound() {
      cout << "动物发出声音" << endl;
   }
};

class Cat : public Animal {
public:
   void sound() {
      cout << "猫咪发出喵喵声" << endl;
   }
};

class Dog : public Animal {
public:
   void sound() {
      cout << "狗狗发出汪汪声" << endl;
   }
};

class CatDog : public Cat, public Dog {

};

int main() {
   CatDog catdog;
   catdog.sound();  // 编译错误,二义性函数调用
   return 0;
}
Salin selepas log masuk

Dalam contoh di atas, kami menentukan kelas bernama CatDog, yang mewarisi kedua-dua kelas Cat dan Dog. Apabila kita memanggil catdog.sound(), ralat kekaburan berlaku kerana kedua-dua Cat dan Dog mempunyai fungsi sound() mereka sendiri. Untuk menyelesaikan masalah ini, kita boleh menentukan fungsi kelas asas untuk digunakan melalui kelayakan skop.

#include <iostream>
using namespace std;

class Animal {
public:
   virtual void sound() {
      cout << "动物发出声音" << endl;
   }
};

class Cat : public Animal {
public:
   void sound() {
      cout << "猫咪发出喵喵声" << endl;
   }
};

class Dog : public Animal {
public:
   void sound() {
      cout << "狗狗发出汪汪声" << endl;
   }
};

class CatDog : public Cat, public Dog {

};

int main() {
   CatDog catdog;
   catdog.Cat::sound();  // 输出:猫咪发出喵喵声
   catdog.Dog::sound();  // 输出:狗狗发出汪汪声
   return 0;
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan kelayakan skop untuk memanggil fungsi sound() kelas asas yang ditentukan untuk mengelakkan masalah kekaburan.

3. Penggunaan pemusnah maya
Dalam hubungan pewarisan C++, jika pemusnah kelas asas tidak diisytiharkan sebagai fungsi maya, ia mungkin menyebabkan masalah bahawa kelas terbitan tidak dikeluarkan dengan betul.

#include <iostream>
using namespace std;

class Base {
public:
   Base() {
      cout << "调用基类的构造函数" << endl;
   }
   ~Base() {
      cout << "调用基类的析构函数" << endl;
   }
};

class Derived : public Base {
public:
   Derived() {
      cout << "调用派生类的构造函数" << endl;
   }
   ~Derived() {
      cout << "调用派生类的析构函数" << endl;
   }
};

int main() {
   Base *baseptr = new Derived;
   delete baseptr;
   return 0;
}
Salin selepas log masuk

Dalam contoh di atas, pemusnah kelas asas Base tidak ditakrifkan sebagai fungsi maya. Apabila kita memadamkan objek kelas terbitan melalui penuding kelas asas, hanya pemusnah kelas asas Base akan dipanggil, bukan pemusnah kelas terbitan Derived. Untuk menyelesaikan masalah ini, pemusnah kelas asas perlu diisytiharkan sebagai fungsi maya.

#include <iostream>
using namespace std;

class Base {
public:
   Base() {
      cout << "调用基类的构造函数" << endl;
   }
   virtual ~Base() {
      cout << "调用基类的析构函数" << endl;
   }
};

class Derived : public Base {
public:
   Derived() {
      cout << "调用派生类的构造函数" << endl;
   }
   ~Derived() {
      cout << "调用派生类的析构函数" << endl;
   }
};

int main() {
   Base *baseptr = new Derived;
   delete baseptr;
   return 0;
}
Salin selepas log masuk

Dalam contoh di atas, kami mengisytiharkan pemusnah kelas asas sebagai fungsi maya, supaya apabila objek kelas terbitan dipadamkan melalui penuding kelas asas, pemusnah kelas terbitan akan dipanggil dahulu, dan kemudian pemusnah kelas asas akan dipanggil fungsi untuk memastikan objek dilepaskan dengan betul.

Ringkasnya, polimorfisme ialah ciri berkuasa dalam C++ dan boleh dicapai melalui fungsi maya dan fungsi maya tulen. Apabila menghadapi masalah dengan berbilang warisan dan pemusnah maya, kami boleh menyelesaikannya melalui kelayakan skop dan pengisytiharan fungsi maya. Dalam aplikasi praktikal, penggunaan rasional polimorfisme boleh meningkatkan kebolehbacaan dan fleksibiliti kod dan membawa kemudahan kepada pembangunan perisian.

Atas ialah kandungan terperinci Perbincangan isu dan penyelesaian pelaksanaan polimorfisme dalam C++. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan