Tôi có một lớp cơ sở với một hàm ảo và tôi muốn ghi đè hàm đó trong một lớp dẫn xuất. Có cách nào để trình biên dịch kiểm tra xem hàm tôi đã khai báo trong lớp dẫn xuất có thực sự ghi đè một hàm trong lớp cơ sở không? Tôi muốn thêm một số macro hoặc thứ gì đó đảm bảo rằng tôi không vô tình khai báo một hàm mới, thay vì ghi đè hàm cũ.
Lấy ví dụ sau:
class parent {
public:
virtual void handle_event(int something) const {
// boring default code
}
};
class child : public parent {
public:
virtual void handle_event(int something) {
// new exciting code
}
};
int main() {
parent *p = new child();
p->handle_event(1);
}
Ở đây parent::handle_event()
được gọi thay vì child::handle_event()
, bởi vì phương thức con bỏ lỡ phần const
khai báo và do đó khai báo một phương thức mới. Đây cũng có thể là lỗi đánh máy trong tên hàm hoặc một số khác biệt nhỏ trong các loại tham số. Nó cũng có thể dễ dàng xảy ra nếu giao diện của lớp cơ sở thay đổi và ở đâu đó một số lớp dẫn xuất không được cập nhật để phản ánh sự thay đổi.
Có cách nào để tránh vấn đề này, bằng cách nào đó tôi có thể nói với trình biên dịch hoặc một số công cụ khác để kiểm tra điều này giúp tôi không? Bất kỳ cờ trình biên dịch hữu ích nào (tốt nhất là cho g ++)? Làm thế nào để bạn tránh những vấn đề này?