Chức năng kết thúc bằng =0
được gọi là deleted function
, điều này rất hữu ích khi bạn không muốn đối tượng sử dụng một số nhà xây dựng nhất định (chẳng hạn như unique_ptr
có ctor sao chép đã xóa).
Nếu chức năng virtual
bị xóa thì tiêu chuẩn lớp sẽ trở thành một loại trừu tượng. Bởi vì trong hầu hết các trường hợp, nguyên mẫu của lớp và các hàm của lớp nằm trong các tệp riêng biệt, điều này có nghĩa là trừ khi bạn phác thảo rõ ràng nguyên mẫu mà bạn đang ghi đè hàm ảo đã xóa thì bạn KHÔNG ghi đè hàm ảo đã xóa. Trình biên dịch không phải là chỉ đơn giản là suy ra rằng bạn có nghĩa là để đặt các chức năng trong đó một khi nó thấy việc thực hiện trong một tập tin hoàn toàn khác nhau.Hãy nhớ rằng nguyên mẫu/ý tưởng triển khai không phải là cách duy nhất để viết mã, bạn cũng có thể đặt quyền thực hiện trong lớp (điều này có thể được thực hiện nếu mã đủ nhỏ và bạn muốn nội tuyến hàm này.).) Và để làm điều đó bạn cần phải một lần nữa, rõ ràng ghi đè lên chức năng ảo đã xóa. Vì vậy, bởi vì bạn cần phải ghi đè lên nó anyway, nó làm cho cảm giác hoàn hảo mà bạn cần phải ghi đè nó một cách rõ ràng trong nguyên mẫu. Chức năng vẫn bị xóa khác.
Đối với một ví dụ cụ thể: giả sử bạn có một List.hpp, List.cpp và main.cpp
Trong List.hpp bạn có một lớp trừu tượng và một lớp học thường xuyên mà kế thừa từ lớp trừu tượng. Trong chính bạn #include "List.hpp"
và không phải List.cpp, phải không? Vì vậy, trình biên dịch không có IDEA gì trong tập tin đó (cho đến khi nó cố gắng biên dịch nó.) Nếu bạn không có chức năng ảo bị xóa ghi đè thì trình biên dịch nghĩ rằng bạn chỉ đơn giản là cố gắng để khởi tạo một lớp trừu tượng và ném một lỗi.
Mặt khác, nếu bạn đang biên soạn List.cpp, thì trình biên dịch cũng sẽ ném một lỗi, lần này phàn nàn rằng hàm bạn đang cố viết chưa thực sự được xác định. Bởi vì Base::deletedFunction()
khác với Derived::deletedFunction()
.
bạn đã tổng hợp nó tốt hơn nhiều :) –
Tôi đồng ý, điều này có lẽ dễ hiểu hơn câu trả lời rambling của tôi, +1. – OmnipotentEntity
Cho dù lớp dẫn xuất là trừu tượng hay không có thể được biết với một từ khóa "trừu tượng" rõ ràng mà C++ thiếu. –