Đa hình động
Đa hình động là một khái niệm lập trình trong các ngôn ngữ hướng đối tượng như C++, trong đó một lớp dẫn xuất có thể ghi đè hoặc xác định lại các phương thức của lớp cơ sở của nó. Điều này có nghĩa là một lệnh gọi phương thức duy nhất có thể có các triển khai khác nhau dựa trên loại đối tượng mà nó được gọi.
Tính đa hình động đạt được thông qua các hàm ảo, là các hàm thành viên của một lớp cơ sở được đánh dấu bằng từ virtual. Khi bạn chỉ định một hàm ảo trong một lớp cơ sở, nó có thể được ghi đè trong bất kỳ lớp dẫn xuất nào để cung cấp một triển khai khác.
Ví dụ
Đây là một ví dụ trong C++ thể hiện tính đa hình động.
#include <iostream>
// Lớp cơ sở
class Shape {
public:
virtual void draw() {
std::cout << "Drawing a shape" << std::endl;
}
};
// Dẫn xuất lớp 1
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing a circle" << std::endl;
}
};
// Dẫn xuất lớp 2
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Drawing a rectangle" << std::endl;
}
};
int main() {
Shape* shape;
Circle circle;
Rectangle rectangle;
// Lưu trữ địa chỉ của đường tròn
shape = &circle;
// Gọi hàm vẽ hình tròn
shape->draw();
// Lưu địa chỉ của hình chữ nhật
shape = &rectangle;
// Gọi hàm vẽ hình chữ nhật
shape->draw();
return 0;
Mã code này định nghĩa một lớp cơ sở shape với một hàm ảo draw. Hai lớp dẫn xuất Circle và Rectangle đều ghi đè hàm draw để cung cấp các triển khai của riêng chúng. Sau đó, trong hàm main, một con trỏ kiểu Shape được sử dụng để gọi các hàm draw ứng của các đối tượng Circle và rectangle. Đầu ra của chương trình này sẽ là:
Drawing a circle
Drawing a rectangle
Như bạn có thể thấy, bằng cách sử dụng tính đa hình động, chúng ta có thể xác định trong thời gian chạy phương thức draw nào sẽ được gọi dựa trên loại đối tượng đang được sử dụng.