ฉันมีคลาสพื้นฐานที่มีฟังก์ชันเสมือนและฉันต้องการแทนที่ฟังก์ชันนั้นในคลาสที่ได้รับ มีวิธีใดบ้างที่จะทำให้คอมไพลเลอร์ตรวจสอบว่าฟังก์ชันที่ฉันประกาศในคลาสที่ได้รับมาแทนที่ฟังก์ชันในคลาสฐานหรือไม่? ฉันต้องการเพิ่มมาโครหรือสิ่งที่ช่วยให้มั่นใจได้ว่าฉันไม่ได้ประกาศฟังก์ชันใหม่โดยไม่ได้ตั้งใจแทนที่จะแทนที่ฟังก์ชันเก่า
ใช้ตัวอย่างนี้:
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);
}
ที่นี่parent::handle_event()
เรียกว่าแทนchild::handle_event()
เนื่องจากวิธีการของเด็กพลาดการconst
ประกาศจึงประกาศวิธีการใหม่ นี่อาจเป็นการพิมพ์ผิดในชื่อฟังก์ชันหรือความแตกต่างเล็กน้อยในประเภทพารามิเตอร์ นอกจากนี้ยังสามารถเกิดขึ้นได้อย่างง่ายดายหากอินเทอร์เฟซของคลาสพื้นฐานเปลี่ยนไปและบางคลาสที่ได้รับมาไม่ได้รับการอัปเดตเพื่อให้สอดคล้องกับการเปลี่ยนแปลง
มีวิธีใดบ้างที่จะหลีกเลี่ยงปัญหานี้ฉันจะบอกคอมไพเลอร์หรือเครื่องมืออื่น ๆ ให้ตรวจสอบสิ่งนี้ให้ฉันได้ไหม แฟล็กคอมไพเลอร์ที่เป็นประโยชน์ใด ๆ (โดยเฉพาะสำหรับ g ++)? คุณจะหลีกเลี่ยงปัญหาเหล่านี้ได้อย่างไร?