Không yêu cầu đánh dấu chúng ảo.
Tôi bắt đầu bằng cách tranh luận rằng quảng cáo ảo cho người đọc mà bạn mong đợi các lớp dẫn xuất để ghi đè ảo để làm điều gì đó hữu ích. Nếu bạn đang thực hiện ảo để làm một cái gì đó, sau đó phương pháp ảo có thể không có gì để làm với các loại điều lớp học của bạn là: trong trường hợp đánh dấu nó ảo là ngớ ngẩn. hãy xem xét:
class CommsObject {
virtual OnConnect();
virtual OnRawBytesIn();
};
class XMLStream : public CommsObject {
virtual OnConnect();
OnRawBytesIn();
virtual OnXMLData();
};
Trong ví dụ đó, OnConnect được ghi nhận là ảo trong cả hai lớp vì có ý nghĩa rằng một hậu duệ luôn muốn biết. OnRawBytesIn không có ý nghĩa để "Xuất" từ XMLStream vì nó sử dụng để xử lý các byte thô và tạo dữ liệu được phân tích cú pháp - mà nó thông báo qua OnXMLData(). Sau khi hoàn thành tất cả những điều đó, tôi sẽ lập luận rằng người duy trì một lớp thứ ba, nhìn vào XMLStream, có thể nghĩ rằng nó sẽ "an toàn" để tạo ra chức năng OnRawBytes của riêng họ và mong đợi nó hoạt động bình thường quá tải. function - tức là lớp cơ sở sẽ gọi một lớp cơ sở chính xác, và lớp bên ngoài sẽ che dấu các OnRawBytes bên trong.
Vì vậy, bỏ qua ảo đã ẩn chi tiết quan trọng từ người tiêu dùng của lớp và làm cho mã hoạt động theo cách không mong muốn.
Vì vậy, ive đi vòng tròn đầy đủ: Đừng cố gắng sử dụng nó như là một gợi ý về mục đích của một chức năng - DO sử dụng nó như là một gợi ý về hành vi của hàm: đánh dấu chức năng ảo luôn để các lập trình hạ lưu phải đọc ít tệp hơn để biết cách một hàm sẽ hoạt động khi được ghi đè.
Nguồn
2010-10-26 14:26:47
Trừ khi nó sẽ được sử dụng như một phần của thư viện. –