การเรียกใช้ฟังก์ชันเสมือนจาก Constructor หรือ Destructor นั้นอันตราย และควรหลีกเลี่ยงเมื่อทำได้ นี่เป็นเพราะว่าฟังก์ชันเสมือนที่คุณเรียกใช้นั้นถูกเรียกจากคลาสฐานไม่ใช่คลาสที่ได้รับ
ใน C++ ทุกคลาสจะสร้างเวอร์ชันของตารางเมธอดเสมือนก่อนที่จะเข้าสู่โครงสร้างของตัวเอง ดังนั้นการเรียกเมธอดเสมือนในตัวสร้างจะเรียกเมธอดเสมือนของคลาสฐาน หรือถ้าไม่มีการนำไปใช้ในระดับนั้น มันจะสร้างการเรียกเมธอดเสมือนล้วนๆ เมื่อ Base ถูกสร้างขึ้นอย่างสมบูรณ์แล้ว คอมไพเลอร์จะเริ่มสร้าง Derived class และแทนที่ตัวชี้เมธอดเพื่อชี้การนำคลาส Derived ไปใช้งาน ตัวอย่างเช่น หากคุณมีรหัส −
ตัวอย่าง
#include<iostream> using namespace std; class Base { public: Base() { f(); } virtual void f() { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: Derived() : Base() {} virtual void f() { std::cout << "Derived" << std::endl; } }; int main() { Derived d; return 0; }
ผลลัพธ์
สิ่งนี้จะให้ผลลัพธ์ -
Base