Latest web development tutorials

C ++ polimorfisme

Polimorfisme harfiah berarti bahwa berbagai bentuk.Ketika hubungan antara kelas melalui warisan antara hirarki kelas, dan akan digunakan polimorfisme.

Ketika C ++ fungsi anggota panggilan berarti polimorfik, akan untuk melakukan fungsi yang berbeda tergantung pada jenis objek fungsi ini dipanggil.

Contoh berikut, Shape kelas dasar berasal untuk dua kategori, sebagai berikut:

#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;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Parent class area
Parent class area

Penyebab kesalahan adalah output, menyebut daerah function () ditetapkan sebagai versi compiler kelas dasar, ini disebutpolimorfisme statis, atau link statis- fungsi yang disebut sebelum pelaksanaan program siap. Kadang-kadang juga disebutikatan karena fungsi daerah () selama kompilasi program telah dibentuk.

Tapi sekarang, biarkan program sedikit diubah di kelas Shape, daerah pertama () pernyataan tempatvirtual kata kunci,sebagai 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;
      }
};

Setelah modifikasi, ketika dikompilasi dan dieksekusi di depan kode contoh, akan menghasilkan hasil sebagai berikut:

Rectangle class area
Triangle class area

Dalam hal ini, compiler adalah pointer untuk melihat konten, bukan jenisnya. Dengan demikian, sejak tri penyimpanan alamat dan objek kelas rec di * bentuk, dan itu akan memanggil fungsi masing-masing daerah ().

Seperti yang Anda lihat, setiap kelas memiliki area sub-fungsi () untuk mencapai kemerdekaan. Ini adalah penggunaan umumpolimorfik.Dengan polimorfisme, Anda dapat memiliki beberapa kelas yang berbeda, semua dengan nama yang sama tetapi parameter fungsi, fungsi bahkan dapat memiliki implementasi yang berbeda dari yang sama.

fungsi virtual

fungsi virtual dideklarasikan menggunakan kata kunci virtualdalam fungsi kelas dasar. Ketika kelas dasar fungsi virtual mendefinisikan kembali didefinisikan dalam kelas turunan, ia memberitahu compiler tidak statis terkait dengan fungsi.

Apa yang kita inginkan adalah setiap titik dalam program ini dapat dipilih sesuai dengan jenis panggilan fungsi objek dipanggil, operasi ini disebutmenghubungkan dinamis, atau terlambat mengikat.

fungsi virtual murni

Anda mungkin ingin mendefinisikan fungsi virtual di kelas dasar, sehingga kelas turunan mendefinisikan fungsi lebih cocok untuk objek, tetapi Anda tidak bisa memberikan implementasi bermakna fungsi virtual di kelas dasar, kali ini akan ada menggunakan fungsi virtual murni.

Kami dapat mendasarkan virtual class daerah function () berbunyi sebagai 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 compiler bahwa fungsi tidak memiliki tubuh, di atas fungsi virtual adalahfungsi virtual murni.