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