Hàm ảo làm cho lớp của nó là lớp cơ sở đa hình . Các lớp có nguồn gốc có thể ghi đè lên các chức năng ảo. Các hàm ảo được gọi thông qua các con trỏ/tham chiếu lớp cơ sở sẽ được giải quyết trong thời gian chạy. Đó là, động loại của đối tượng được sử dụng thay vì tĩnh loại của nó:
Derived d;
Base& rb = d;
// if Base::f() is virtual and Derived overrides it, Derived::f() will be called
rb.f();
Một hàm ảo thuần tuý là một hàm ảo mà tuyên bố kết thúc bằng =0
:
class Base {
// ...
virtual void f() = 0;
// ...
Một hàm ảo thuần túy làm cho lớp đó được định nghĩa cho trừu tượng (không giống như trong Java, nơi bạn có một từ khóa để khai báo rõ ràng lớp trừu tượng). Các lớp trừu tượng không thể được khởi tạo. Các lớp bắt nguồn cần phải ghi đè/triển khai tất cả các hàm ảo thuần túy được kế thừa. Nếu họ không, họ cũng sẽ trở nên trừu tượng.
Một 'tính năng' thú vị của C++ là một lớp có thể định nghĩa một hàm ảo thuần túy có triển khai thực hiện. (What that's good for is debatable.)
Lưu ý rằng C++ 11 mang một công dụng mới của các từ khóa delete
và default
trông tương tự như cú pháp của hàm ảo thuần túy:
my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;
Xem this question và this one để biết thêm thông tin về việc sử dụng số điện thoại delete
và default
này.
"một chức năng ảo không có nội dung"> không chính xác. họ có thể có rất nhiều cơ thể. –