Bài tập kế thừa đa hình trong c năm 2024

Kế thừa và đa hình

0% encontró este documento útil (0 votos)

115 vistas

40 páginas

Derechos de autor

© Attribution Non-Commercial (BY-NC)

Formatos disponibles

PDF, TXT o lea en línea desde Scribd

Compartir este documento

¿Le pareció útil este documento?

0% encontró este documento útil (0 votos)

115 vistas40 páginas

Kế thừa và đa hình

Saltar a página

Está en la página 1de 40

Buscar dentro del documento

Recompense su curiosidad

Todo lo que desea leer.

En cualquier momento. En cualquier lugar. Cualquier dispositivo.

Sin compromisos. Cancele cuando quiera.

Bài tập kế thừa đa hình trong c năm 2024

Ở bài này chúng ta sẽ tìm hiểu thêm một tính chất nữa của lập trình hướng đối tượng đó là tính đa hình trong C ++ nhé. Cùng Techcademy tìm hiểu chi tiết qua bài viết dưới đây nhé.

1. Tính Đa Hình Trong C++ Là Gì

Đa hình là 1 trong bốn tính chất đặc trưng của lập trình hướng đối tượng bên cạnh tính đóng gói, tính trừu tượng và tính kế thừa. Vậy thì đa hình là gì?

Đa hình (polymorphism) là hiện tượng mà những đối tượng thuộc các class khác nhau có thể biểu diễn cùng một thông thiệp theo các cách khác nhau. Hơi nặng về lý thuyết 1 chút nhưng xem thí dụ sau bạn sẽ rõ ngay!

Ví dụ hai con vật là con chó và con mèo, hai con vật này đều có thể phát ra tiếng nhưng con mèo sẽ kêu “meo meo” còn con chó lại sủa “gâu gâu”. Hành động phát ra tiếng này tuy là một hành động nhưng khi được 2 đối tượng khác nhau là chó và mèo thực hiện thì lại khác nhau.

Bài tập kế thừa đa hình trong c năm 2024
Tính Đa Hình Trong C++ Là Gì

Tính đa hình chủ yếu được chia thành hai loại:

  • Compile time Polymorphism.
  • Runtime Polymorphism.
    Bài tập kế thừa đa hình trong c năm 2024
    Các Loại Đa Hình Trong C++

+ Compile time Polymorphism:

Tính đa hình này được sử dụng bằng cách nạp chồng hàm hoặc nạp chồng toán tử.

Vậy nạp chồng hàm và nạp chồng toán tử là gì?

Nạp chồng hàm

Nạp chồng hàm (Function Overloading) cho phép sử dụng cùng một tên gọi cho các hàm “giống nhau” (có cùng mục đích). Nhưng khác nhau về kiểu dữ liệu tham số hoặc số lượng tham số.

Nạp chồng hàm cho phép ta khai báo và định nghĩa các hàm trên cùng với một tên gọi.

Chúng ta lấy ví dụ:

include <iostream>

using namespace std; class inDuLieu { public:

  void hamIn(int i) {  
    cout << "In so nguyen: " << i << endl;  
  }
  void hamIn(double  f) {  
    cout << "In so thuc: " << f << endl;  
  }
  void hamIn(string s) {  
    cout << "In chuoi: " << s << endl;  
  }  
}; int main(void) { inDuLieu idl; // Goi ham hamIn de in so nguyen idl.hamIn(1235); // Goi ham hamIn de in so thuc idl.hamIn(67.02); // Goi ham hamIn de in chuoi idl.hamIn("Codelearn.io"); return 0; }

Biên dịch chương trình ta có kết quả:

Bài tập kế thừa đa hình trong c năm 2024
Các Loại Đa Hình Trong C++

Trong thí dụ trên, ta chỉ dùng một hàm duy nhất có tên là hamIn() nhưng có thể dùng được cho 3 tình huống khác nhau. Đây là một thể hiện của tính đa hình.

Nạp chồng toán tử

Nạp chồng toán tử (Operator Overloading) được dùng để định nghĩa toán tử cho có sẵn trong c++ phục vụ cho dữ liệu riêng do bạn tạo ra.

Giả sử có lớp PhanSo và có các phương thức tính toán như Cong, Tru, Nhan, Chia.

Nếu gặp một biểu thức phức tạp, số lượng phép tính nhiều thì việc sử dụng các phương thức trên khá khó khăn và có thể gây rối cho người lập trình. Vì thế ta sẽ nạp chồng lại các toán tử để có thể tạo một cái nhìn trực quan vào code, giảm thiểu các lỗi sai không đáng có.

Các toán tử có thể nạp chồng

Bài tập kế thừa đa hình trong c năm 2024
Các Loại Đa Hình Trong C++

Các toán tử không thể nạp chồng:

Ví dụ:

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; }

Sau khi chạy chương trình cho kết quả:

Bài tập kế thừa đa hình trong c năm 2024
Các Loại Đa Hình Trong C++

Trong ví dụ trên, ta đã nạp chồng lại toán tử cộng. Tính đa hình được thể hiện qua việc nạp chồng để tính tổng Box1 và Box2.

+ Runtime Polymorphism:

Các bàn còn nhớ ví dụ đầu tiên của bài không.

include <iostream>

using namespace std; class Mayvitinh{ public: void show(){

   cout << "mayvitinh" << endl;  
} }; class mayAcer: public Mayvitinh{
public:           
void show(){  
    cout << "mayAcer" << endl;  
}  
}; int main(){
mayAcer may1;   
Mayvitinh *tenmay = &may1;  
tenmay->show();   
}

Có thể thấy chương trình sau khi chạy sẽ gọi đến phương thức show() của lớp Mayvitinh, mà không gọi tới phương thức show() của lớp mayAcer.

Vậy để chương trình gọi tới phương thức show() của lớp mayAcer ta sử dụng hàm ảo virtual như sau:

include <iostream>

using namespace std; class Mayvitinh{ public: virtual void show(){

   cout << "mayvitinh" << endl;  
} }; class mayAcer: public Mayvitinh{
public:           
void show(){  
    cout << "mayAcer" << endl;  
}  
}; int main(){
mayAcer may1;   
Mayvitinh *tenmay = &may1;  
tenmay->show();   
}

Sau khi biên dịch chương trình sẽ có kết quả:

Bài tập kế thừa đa hình trong c năm 2024
Các Loại Đa Hình Trong C++

Trong ví dụ trên mình đã thêm từ khóa

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; }

2 vào hàm

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; }

3 trong lớp cơ sở

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; }

4.

Từ khóa

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; }

2 này dùng để khai báo một hàm là hàm ảo.

Khi khai báo hàm ảo với từ khóa

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; }

2 nghĩa là hàm này sẽ được gọi theo loại đối tượng được trỏ (hoặc tham chiếu), chứ không phải theo loại của con trỏ (hoặc tham chiếu). Và điều này dẫn tới kết quả khác nhau:

  • Nếu không khai báo hàm ảo

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }  
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }  
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; } 2 trình biên dịch sẽ gọi hàm tại lớp cở sở

  • Nếu dùng hàm ảo

include <iostream>

using namespace std; class Box { public:

  double tinhTheTich(void)  
  {  
     return chieudai * chieurong * chieucao;  
  }  
  void setChieuDai( double dai )  
  {  
      chieudai = dai;  
  }  
  void setChieuRong( double rong )  
  {  
      chieurong = rong;  
  }  
  void setChieuCao( double cao )  
  {  
      chieucao = cao;  
  }  
  // Nap chong toa tu + de cong hai doi tuong Box.  
  Box operator+(const Box& b)  
  {  
     Box box;  
     box.chieudai = this->chieudai + b.chieudai;  
     box.chieurong = this->chieurong + b.chieurong;  
     box.chieucao = this->chieucao + b.chieucao;  
     return box;  
  }  
private:
  double chieudai;      // chieu dai cua mot box  
  double chieurong;     // Chieu rong cua mot box  
  double chieucao;      // Chieu cao cua mot box  
}; // ham main cua chuong trinh int main( ) { Box Box1; // Khai bao Box1 la cua kieu Box Box Box2; // Khai bao Box2 la cua kieu Box Box Box3; // Khai bao Box3 la cua kieu Box double thetich = 0.0; // Luu giu the tich cua mot box tai day // thong tin chi tiet cua box 1 Box1.setChieuDai(5); Box1.setChieuRong(2); Box1.setChieuCao(4); // thong tin chi tiet cua box 2 Box2.setChieuDai(7); Box2.setChieuRong(6); Box2.setChieuCao(9); // the tich cua box 1 thetich = Box1.tinhTheTich(); cout << "The tich cua Box1 la: " << thetich <<endl; // the tich cua box 2 thetich = Box2.tinhTheTich(); cout << "The tich cua Box2 la: " << thetich <<endl; // cong hai doi tuong nhu sau: Box3 = Box1 + Box2; // the tich cua box 3 thetich = Box3.tinhTheTich(); cout << "The tich cua Box3 la: " << thetich <<endl; return 0; } 2 trình biên dịch sẽ gọi hàm tại lớp dẫn xuất

Khi nhận thấy có khai báo virtual trong lớp cơ sở, trình biên dịch sẽ thêm vào mỗi đối tượng của lớp cơ sở và những lớp dẫn xuất của nó 1 con trỏ chỉ tới bảng phương thức ảo (virtual function table). Con trỏ đó có tên là vptr (virtual pointer). Bảng phương thức ảo là nơi chứa các con trỏ chỉ đến đoạn chương trình đã biên dịch ứng với các phương thức ảo.

Mỗi lớp có một bảng phương thức ảo. Trình biên dịch chỉ lập bảng phương thức ảo khi bắt đầu có việc tạo đối tượng của lớp. Đến lúc chương trình chạy, phương thức ảo của đối tượng mới được nối kết và thi hành thông qua con trỏ vptr.

3. Sự Khác Biệt Giữa Tính Đa Hình Và Tính Kế Thừa

Đa hình vs Kế thừa trong OOP

Đa hình là một khả năng của một đối tượng để hành xử theo nhiều cách. Kế thừa là tạo ra một lớp mới bằng cách sử dụng các thuộc tính và phương thức của một lớp hiện có. Sử dụng Đa hình được sử dụng cho các đối tượng để gọi dạng phương thức nào trong thời gian biên dịch và thời gian chạy. Kế thừa được sử dụng để tái sử dụng mã. Thực hiện Đa hình được thực hiện trong các phương pháp. Kế thừa được thực hiện trong các lớp. Thể loại Đa hình có thể được chia thành quá tải và ghi đè. Kế thừa có thể được chia thành thừa kế đơn cấp, đa cấp, phân cấp, lai và nhiều kế thừa.

Bài tập kế thừa đa hình trong c năm 2024
Sự Khác Biệt Giữa Tính Đa Hình Và Tính Kế Thừa

4. Bài Tập Về Tính Đa Hình Trong C++

Ví dụ: Lớp Bus kế thừa từ lớp Car, cả hai lớp này đều định nghĩa phương thức show()

class Car{ public: void show(); }; class Bus: public Car{

public:           
void show();   
};

khi đó, nếu ta khai báo một con trỏ lớp Bus, nhưng lại trỏ vào địa chỉ của một đối tượng lớp Car:

Bus myBus; Car *ptrCar = &myBus; // đúng nhưng khi gọi: ptrCar->show();

thì chương trình sẽ gọi đến phương thức show() của lớp Car (là kiểu của con trỏ ptrCar), mà không gọi tới phương thức show() của lớp Bus (là kiểu của đối tượng myBus mà con trỏ ptrCar đang trỏ tới).

Để giải quyết vấn đề này, C++ đưa ra một khái niệm là phương thức trừu tượng. Bằng cách sử dụng phương thức trừu tượng. Khi gọi một phương thức từ một con trỏ đối tượng, trình biên dịch sẽ xác định kiểu của đối tượng mà con trỏ đang trỏ đến, sau đó nó sẽ gọi phương thức tương ứng với đối tượng mà con trỏ đang trỏ tới.

Khai báo phương thức trừu tượng

Phương thức trừu tượng (còn gọi là phương thức ảo, hàm ảo) được khai báo với từ khoá virtual:

  • Nếu khai báo trong phạm vi lớp:

virtual <Kiểu trả về> <Tên phương thức>([<Các tham số>]);

  • Nếu định nghĩa ngoài phạm vi lớp:

virtual <Kiểu trả về> <Tên lớp>::<Tên phương thức>([<Các tham số>]){…}

Ví dụ:

class Car{

public:   
      virtual void show();   
};

là khai báo phương thức trừu tượng show() của lớp Car: phương thức không có tham số và không cần giá trị trả về (void).