Phương thức ảo
Các phương thức ảo là một khía cạnh quan trọng của tính đa hình động trong C++. Chúng cho phép các phương thức của lớp con ghi đè lên các phương thức của lớp cơ sở, vì vậy phương thức thích hợp được gọi tùy thuộc vào loại thực tế của một đối tượng trong thời gian chạy.
Để khai báo một phương thức là ảo, chỉ cần sử dụng từ khóa ảo trong phần khai báo của phương thức trong lớp cơ sở. Điều này cho trình biên dịch biết rằng phương thức nên được coi là một phương thức ảo, cho phép nó bị ghi đè bởi các lớp dẫn xuất.
Mã code ví dụ
Đây là một ví dụ minh họa các phương thức ảo:
#include <iostream>
// Lớp cơ sở
class Shape {
public:
virtual double area() const {
return 0;
}
};
// Lớp được đề xuất
class Circle : public Shape {
public:
Circle(double r) : radius(r) {}
// Ghi đè phương thức của lớp cơ sở
double area() const override {
return 3.14 * radius * radius;
}
private:
double radius;
};
// Lớp được đề xuất
class Rectangle : public Shape {
public:
Rectangle(double w, double h) : width(w), height(h) {}
// Ghi đè phương thức của lớp cơ sở
double area() const override {
return width * height;
}
private:
double width;
double height;
};
int main() {
Circle c(5);
Rectangle r(4, 6);
Shape* shape = &c;
std::cout << "Circle's area: " << shape->area() << std::endl;
shape = &r;
std::cout << "Rectangle's area: " << shape->area() << std::endl;
return 0;
}
Trong ví dụ này, chúng ta định nghĩa một lớp cơ sở Shape có một phương thức ảo area. Phương thức này sau đó được ghi đè bởi các lớp dẫn xuất Circle và Rectangle. Bằng cách sử dụng một phương thức ảo và một con trỏ lớp cơ sở tới các đối tượng dẫn xuất, chúng ta có thể gọi phương thức area thích hợp dựa trên loại đối tượng thực tế khi chạy.