Nó phụ thuộc vào ngữ nghĩa dự định của A, B, và C và ngữ nghĩa của so sánh(). So sánh là một khái niệm trừu tượng không nhất thiết phải có một ý nghĩa chính xác (hoặc bất kỳ ý nghĩa gì cả, cho vấn đề đó). Không có câu trả lời đúng cho câu hỏi này.
Dưới đây là hai kịch bản mà so sánh có nghĩa là hai điều hoàn toàn khác nhau với hệ thống phân cấp cùng lớp:
class Object
{
virtual int compare(const Object&) = 0;
float volume;
};
class Animal : Object
{
virtual int compare(const Object&);
float age;
};
class Zebra : Animal
{
int compare(const Object&);
};
Chúng ta có thể xem xét (ít nhất) hai cách so sánh hai Zebras: đó là cũ, và trong đó có khối lượng hơn ? Cả hai so sánh đều hợp lệ và dễ tính toán; sự khác biệt là chúng ta có thể sử dụng âm lượng để so sánh Zebra với bất kỳ đối tượng nào khác, nhưng chúng ta chỉ có thể sử dụng tuổi để so sánh Zebras với các động vật khác. Nếu chúng ta muốn so sánh() để thực hiện ngữ nghĩa so sánh tuổi, nó không có ý nghĩa gì khi định nghĩa compare() trong lớp Object, vì ngữ nghĩa không được định nghĩa ở cấp độ phân cấp này. Cần lưu ý rằng không phải trường hợp nào cũng yêu cầu bất kỳ phép đúc nào, vì ngữ nghĩa được định nghĩa ở cấp độ cơ sở (cho dù đó là Đối tượng khi so sánh khối lượng hoặc Động vật khi so sánh tuổi).
Điều này đặt ra vấn đề quan trọng hơn - rằng một số lớp không phù hợp với một hàm so sánh tất cả(). Thông thường, nó có ý nghĩa hơn khi triển khai nhiều hàm để khai báo rõ ràng những gì đang được so sánh, như compare_age() và compare_volume(). Định nghĩa của các hàm này có thể xảy ra tại điểm trong hệ thống phân cấp thừa kế, nơi ngữ nghĩa trở nên có liên quan, và nó không đáng kể để thích nghi chúng với các lớp con (nếu nhu cầu thích ứng). So sánh đơn giản bằng cách sử dụng compare() hoặc operator ==() thường chỉ có ý nghĩa với các lớp đơn giản, nơi việc thực hiện ngữ nghĩa chính xác là rõ ràng và rõ ràng.
Câu chuyện dài ngắn ... "nó phụ thuộc".
Nguồn
2009-05-08 17:43:06
Không, bạn nên sử dụng toán tử ==. Đó là những gì nó cho. Không cần có chức năng So sánh. – jalf
@ jalf Tôi nghĩ anh ấy muốn làm hơn, bằng, hoặc ít hơn so sánh, như strcmp(). Lưu ý rằng Compare() trả về một int, không phải là một bool. –