Đa hình trong C++
Đa hình (từ gốc trong tiếng Anh là polymorphism) có thể hiểu là có nhiều dạng khác nhau. Trong ngôn ngữ lập trình, thông thường, đa hình xảy ra khi có một hệ thống phân cấp các class và chúng liên quan với nhau bởi tính kế thừa.
Tính đa hình trong C++ nghĩa là một lệnh gọi tới một hàm thành viên sẽ làm cho một hàm khác để được thực thi phụ thuộc vào kiểu của đối tượng đã gọi hàm đó.
Để hiểu thêm về tính đa hình trong ngôn ngữ lập trình C++, bạn có thể tìm hiểu ví dụ được xem xét dưới đây, ở đây lớp cơ sở đã được kế thừa bởi hai lớp khác trong C++:
#include <iostream>
using namespace std;
int dt=0;
class Hinh {
protected: int chieurong, chieucao;
public:
Hinh( int a=0, int b=0)
{ chieurong = a;
chieucao = b; }
int dientich()
{
cout << "Dien tich cua lop cha:" <<endl;
return 0; }
};
class HinhChuNhat: public Hinh{
public:
HinhChuNhat( int a=0, int b=0):Hinh(a, b) { }
int dientich ()
{ dt= (chieurong * chieucao);
cout << "Dien tich cua lop HinhChuNhat la: " << dt << endl; }
};
class TamGiac: public Hinh{
public:
TamGiac( int a=0, int b=0):Hinh(a, b) { }
int dientich ()
{ dt= (chieurong * chieucao / 2);
cout << "Dien tich cua lop TamGiac la: " << dt << endl; }
};
// ham main cua chuong trinh
int main( )
{ Hinh *hinh;
HinhChuNhat hcn(13,6);
TamGiac tag(8, 9);
// luu giu dia chi cua HinhChuNhat hinh = &hcn;
// goi dien tich cua hinh chu nhat. hinh->dientich();
// luu giu dia chi cua TamGiac hinh = &tag;
// goi dien tich cua tam giac. hinh->dientich();
return 0;
}Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
![]()
Lý do cho output không chính xác đó là vì: lời gọi của hàm dientich() đang được thiết lập một lần bởi compiler như phiên bản được định nghĩa trong lớp cơ sở đó. Điều này gọi là static resolution (sự phân giải tĩnh) của lời gọi hàm, hoặc static linkage (sự liên hợp tĩnh) – lời gọi hàm được sửa trước khi chương trình được thực thi. Đôi khi nó cũng được gọi là early binding (hoặc static binding) bởi vì hàm dientich() được thiết lập trong khi biên dịch chương trình.
Bây giờ, chúng ta sửa chương trình trên một chút và đặt trước dòng int dientich() trong lớp Hinh với từ khóa virtual, khi đó nó trông như sau:
class Hinh {
protected:
int chieurong, chieucao;
public:
Hinh( int a=0, int b=0)
{
chieurong = a;
chieucao = b;
}
virtual int dientich()
{
cout << "Dien tich cua lop cha: " <<endl;
return 0;
}
};Sau khi sửa đổi, chạy lại chương trình C++ trên sẽ cho kết quả sau:

Lúc này, compiler nhìn vào các nội dung của con trỏ thay vì kiểu của nó. Vì thế, khi địa chỉ của các đối tượng của lớp hcn và tag được lưu giữ trong *hinh, thì hàm dientich() tương ứng được gọi.
Như bạn có thể thấy, mỗi lớp con có một triển khai hàm dientich() riêng biệt. Đây là cách chung mà Đa hình trong C++ được sử dụng. Bạn có các lớp khác nhau với cùng một tên hàm, và có thể là cùng tham số, nhưng trình triển khai là khác nhau.
Hàm virtual trong C++
Một hàm virtual là một hàm trong một lớp cơ sở mà được khai báo bởi sử dụng từ khóa virtual trong C++. Việc định nghĩa trong một lớp cơ sở một hàm virtual, với phiên bản khác trong một lớp kế thừa, báo cho compiler rằng: chúng ta không muốn Static Linkage cho hàm này.
Những gì chúng ta làm là muốn việc lựa chon hàm để được gọi tại bất kỳ điểm nào đã cung cấp trong chương trình là dựa trên kiểu đối tượng, mà với đó nó được gọi. Hoạt động này có thể gọi tắt là dynamic linkage, hoặc late binding trong C++.
Hàm pure virtual trong C++
Nó là có thể nếu bạn muốn bao một hàm virtual trong một lớp cơ sở, để mà nó có thể được tái định nghĩa trong một lớp kế thừa để phù hợp với các đối tượng của lớp đó, nhưng đó là định nghĩa không có ý nghĩa gì.
Chúng ta có thể thay đổi hàm virtual là dientich() trong lớp cơ sở thành như sau:
class Hinh {
protected:
int chieurong, chieucao;
public:
Hinh( int a=0, int b=0)
{
chieurong = a;
chieucao = b;
}
// ham pure virtual
virtual int dientich() = 0;
};=0 nói cho compiler rằng hàm đó không có phần thân và hàm virtual trên sẽ được gọi là hàm pure virtual function trong C++..
Theo Tutorialspoint
Bài trước: Nạp chồng toán tử truy cập thành viên lớp (->) trong C++
Bài tiếp: Trừu tượng hóa dữ liệu trong C++
Bạn nên đọc
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:
Cũ vẫn chất
-

Cách cho người lạ xem Nhật ký Zalo
Hôm qua -

Sửa lỗi 0x80070643 trên Windows
Hôm qua -

Tổng hợp thao tác Touchpad trên Windows 10, Windows 11
Hôm qua -

Những stt hay nói về miệng lưỡi thế gian đáng để suy ngẫm
Hôm qua -

30+ bài thơ về rượu bia hay, thơ chế về rượu bia hài hước và bá đạo cho dân nhậu
Hôm qua -

Cách chia sẻ một thư mục (folder) trên Windows 10
Hôm qua -

Stt về tiền hài hước, những câu nói hài hước về tiền nhưng thâm thúy, ‘thô mà thật’
Hôm qua -

Cài đặt Python Package với PIP trên Windows, Mac và Linux
Hôm qua -

Những trang web đen siêu hay không thể tìm thấy trên Google
Hôm qua 3 -

Công thức tính chu vi hình tứ giác, diện tích hình tứ giác
Hôm qua 1
Học IT
Công nghệ
Microsoft Word 2013
Microsoft Word 2007
Microsoft Excel 2019
Microsoft Excel 2016
Microsoft PowerPoint 2019
Google Sheets
Lập trình Scratch
Bootstrap
Hướng dẫn
Ô tô, Xe máy