Polimorfisme C++


PolymorphismSecara literal bermaksud pelbagai bentuk. Polimorfisme digunakan apabila terdapat hierarki antara kelas dan kelas berkaitan melalui pewarisan.

Polimorfisme C++ bermaksud apabila fungsi ahli dipanggil, fungsi yang berbeza akan dilaksanakan bergantung pada jenis objek yang memanggil fungsi tersebut.

Dalam contoh berikut, kelas asas Shape diterbitkan kepada dua kelas, seperti yang ditunjukkan di bawah:

#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();

   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}

Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:

Parent class area
Parent class area

Sebab untuk output ralat ialah kawasan fungsi panggilan() ditetapkan oleh pengkompil kepada versi dalam kelas asas Ini dipanggil polimorfisme statik, atau pemautan statik. - Panggilan fungsi disediakan sebelum pelaksanaan program. Ini kadangkala dipanggil ikatan awal kerana fungsi kawasan() ditetapkan semasa penyusunan atur cara.

Tetapi sekarang, mari kita ubah suai sedikit program Dalam kelas Shape, letakkan kata kunci maya sebelum pengisytiharan kawasan(), seperti berikut:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

Selepas. pengubahsuaian, apabila kod contoh sebelumnya disusun dan dilaksanakan, ia akan menghasilkan hasil berikut:

Rectangle class area
Triangle class area

Pada ketika ini, pengkompil sedang melihat kandungan penunjuk, bukan jenisnya. Oleh itu, oleh kerana alamat objek kelas tri dan rec disimpan dalam *shape, fungsi kawasan() masing-masing dipanggil.

Seperti yang anda lihat, setiap subkelas mempunyai pelaksanaan bebas bagi kawasan fungsi(). Beginilah cara umum polimorfik digunakan. Dengan polimorfisme, anda boleh mempunyai beberapa kelas yang berbeza, semuanya dengan fungsi dengan nama yang sama tetapi pelaksanaan yang berbeza, dan parameter fungsi juga boleh sama.

Fungsi maya

Fungsi maya ialah fungsi yang diisytiharkan dalam kelas asas menggunakan kata kunci maya. Apabila anda mentakrifkan semula fungsi maya yang ditakrifkan dalam kelas asas dalam kelas terbitan, anda memberitahu pengkompil untuk tidak memaut secara statik ke fungsi tersebut.

Apa yang kita mahukan ialah pada bila-bila masa dalam atur cara, kita boleh memilih fungsi untuk dipanggil berdasarkan jenis objek yang dipanggil Operasi ini dipanggil pautan dinamik, atau Set pengikat lewat.

Fungsi maya tulen

Anda mungkin mahu mentakrifkan fungsi maya dalam kelas asas supaya anda boleh mentakrifkannya semula dalam kelas terbitan untuk berfungsi dengan lebih baik dengan objek, tetapi anda mempunyai If a meaningful pelaksanaan fungsi maya tidak boleh diberikan, fungsi maya tulen akan digunakan pada masa ini.

Kita boleh menulis semula kawasan fungsi maya() dalam kelas asas seperti berikut:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // pure virtual function
      virtual int area() = 0;
};

= 0 memberitahu pengkompil bahawa fungsi itu tidak mempunyai badan, dan fungsi maya di atas ialah fungsi maya tulen.