Warisan C++


Salah satu konsep terpenting dalam pengaturcaraan berorientasikan objek ialah warisan. Warisan membolehkan kami mentakrifkan kelas berdasarkan kelas lain, yang menjadikan penciptaan dan penyelenggaraan aplikasi lebih mudah. Melakukannya juga mencapai kesan penggunaan semula fungsi kod dan meningkatkan masa pelaksanaan.

Apabila mencipta kelas, anda tidak perlu menulis semula ahli data baharu dan fungsi ahli, anda hanya perlu menentukan bahawa kelas baharu mewarisi ahli kelas sedia ada. Kelas sedia ada ini dipanggil kelas asas dan kelas baharu dipanggil kelas terbitan.

warisan mewakili hubungan adalah. Sebagai contoh, mamalia adalah haiwan, anjing adalah mamalia, oleh itu, anjing adalah haiwan, dan sebagainya.

Kelas Asas & Kelas Terbitan

Kelas boleh diperoleh daripada berbilang kelas, yang bermaksud, ia boleh mewarisi data dan fungsi daripada berbilang kelas asas. Untuk menentukan kelas terbitan, kami menggunakan senarai terbitan kelas untuk menentukan kelas asas. Senarai terbitan kelas dinamakan sempena satu atau lebih kelas asas dan mempunyai bentuk berikut:

class derived-class: access-specifier base-class

di mana penentu akses adalah awam, dilindungi atau peribadi di mana One , kelas asas ialah nama kelas yang ditakrifkan sebelum ini. Jika penentu akses tidak digunakan, lalai adalah peribadi.

Katakan terdapat kelas asas Shape dan Rectangle ialah kelas terbitannya seperti berikut:

#include <iostream>
 
using namespace std;

// 基类
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 派生类
class Rectangle: public Shape
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

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

Total area: 35

Kawalan Akses dan Warisan

Kelas terbitan boleh mengakses semua ahli bukan persendirian kelas asas. Oleh itu, jika ahli kelas asas tidak mahu diakses oleh fungsi ahli kelas terbitan, mereka harus diisytiharkan peribadi dalam kelas asas.

Kami boleh meringkaskan jenis akses yang berbeza berdasarkan hak akses, seperti berikut:

访问publicprotectedprivate
同一个类yesyesyes
派生类yesyesno
外部的类yesnono

Kelas terbitan mewarisi semua kaedah kelas asas, dengan pengecualian berikut:

  • Pembina, pemusnah dan pembina salinan kelas asas.

  • Pengendali terlebih beban untuk kelas asas.

  • Fungsi rakan kelas asas.

Jenis Diwarisi

Apabila kelas diperoleh daripada kelas asas, kelas asas boleh diwarisi sebagai awam, dilindungi atau swasta Beberapa jenis. Jenis yang diwarisi ditentukan melalui penentu akses yang dijelaskan di atas.

Kami hampir tidak pernah menggunakan warisan dilindungi atau peribadi dan biasanya menggunakan warisan awam. Apabila menggunakan jenis warisan yang berbeza, ikut peraturan berikut:

  • Warisan awam (awam): Apabila kelas berasal daripada awam Apabila ia ialah kelas asas, ahli awam kelas asas juga merupakan ahli awam kelas terbitan dan ahli dilindungi kelas asas juga ahli dilindungi ahli kelas terbitan, ahli peribadi kelas asas tidak boleh diakses secara langsung oleh kelas terbitan, tetapi boleh diakses dengan memanggil awam< kelas asas. 🎜> dan dilindungi ahli.

  • Warisan dilindungi: Apabila kelas diperoleh daripada kelas asas dilindungi, kelas asas awam dan ahli dilindungi akan menjadi ahli dilindungi daripada kelas terbitan.

  • Warisan persendirian: Apabila kelas diperoleh daripada kelas asas peribadi, kelas asas awam dan ahli yang dilindungi akan menjadi ahli swasta kelas terbitan.

Warisan berbilang

Warisan berbilang bermakna subkelas boleh mempunyai berbilang kelas induk dan ia mewarisi ciri berbilang kelas induk.

Kelas C++ boleh mewarisi ahli daripada berbilang kelas Sintaks adalah seperti berikut:

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

Di mana, kaedah pewarisan pengubah suai akses ialah

awam, dilindungi atau peribadi. Salah satu daripadanya digunakan untuk mengubah suai setiap kelas asas, dipisahkan dengan koma, seperti yang ditunjukkan di atas. Sekarang mari kita lihat contoh berikut bersama-sama:

#include <iostream>
 
using namespace std;

// 基类 Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 基类 PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};

// 派生类
class Rectangle: public Shape, public PaintCost
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   // 输出总花费
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

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

Total area: 35
Total paint cost: 50