ฟังก์ชันเสมือนที่เรียกจากคอนสตรัคเตอร์หรือ 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