การแทนที่ฟังก์ชันเป็นคุณลักษณะทั่วไปของ C++ โดยทั่วไปการแทนที่ฟังก์ชันหมายถึงการนิยามฟังก์ชันที่มีอยู่ในคลาสฐานใหม่ และยังถูกกำหนดในคลาสที่ได้รับอีกด้วย ดังนั้นลายเซ็นของฟังก์ชันจะเหมือนกันแต่ลักษณะการทำงานจะแตกต่างกัน
แต่อาจมีสถานการณ์ที่โปรแกรมเมอร์ทำผิดพลาดขณะแทนที่ฟังก์ชันนั้น เช่นถ้าลายเซ็นไม่เหมือนกัน นั่นจะถือว่าเป็นฟังก์ชันอื่น แต่ไม่ใช่วิธีการแทนที่หรือนั่น ในกรณีนั้น เราสามารถใช้คำสำคัญแทนที่ได้ คำหลักนี้ถูกนำมาใช้ใน C+ +11 เมื่อคอมไพเลอร์พบคีย์เวิร์ดประเภทนี้ ก็สามารถเข้าใจได้ว่านี่เป็นเวอร์ชันที่ถูกแทนที่ของคลาสเดียวกัน
เรามาดูตัวอย่างเพื่อทำความเข้าใจแนวคิดกัน
ตัวอย่าง
#include <iostream> using namespace std; class BaseClass{ public: virtual void display() { cout << "Displaying from Base Class\n"; } }; class DerivedClass : public BaseClass{ public: void display() { cout << "Displaying from Derived Class\n"; } }; main() { BaseClass *b_ptr; b_ptr = new DerivedClass(); b_ptr->display(); }
ผลลัพธ์
Displaying from Derived Class
ในกรณีนี้ โปรแกรมทำงานได้ดีเนื่องจากลายเซ็นเหมือนกัน ในตัวอย่างต่อไปนี้ ลายเซ็นจะแตกต่างกัน สำหรับคำสำคัญแทนที่ จะทำให้เกิดข้อผิดพลาด
ตัวอย่าง
#include <iostream> using namespace std; class BaseClass{ public: virtual void display() { cout << "Displaying from Base Class\n"; } }; class DerivedClass : public BaseClass{ public: void display(int x) override{ cout << "Displaying from Derived Class\n"; } }; main() { BaseClass *b_ptr; b_ptr = new DerivedClass(); b_ptr->display(); }
ผลลัพธ์
[Error] 'void DerivedClass::display(int)' marked override, but does not override
ในกรณีนี้ โปรแกรมทำงานได้ดีเนื่องจากลายเซ็นเหมือนกัน ในตัวอย่างต่อไปนี้ ลายเซ็นจะแตกต่างกัน สำหรับคำสำคัญแทนที่ จะทำให้เกิดข้อผิดพลาด