เตือน: การเรียก virtual function จาก constructor หรือ destructor เป็นอันตรายและควรหลีกเลี่ยง เพราะ virtual function ที่ถูกเรียกจะเป็นของ Base class ไม่ใช่ Derived class
ใน C++ ทุกคลาสสร้าง virtual method table (vtable) ของตัวเอง ก่อน เข้า constructor ของตัวเอง ดังนั้นการเรียก virtual method ใน constructor จะเรียกของ Base class
ตัวอย่างแสดงปัญหา
#include <iostream>
using namespace std;
class Base {
public:
Base() { f(); }
virtual void f() { cout << "Base" << endl; }
};
class Derived : public Base {
public:
Derived() : Base() {}
virtual void f() { cout << "Derived" << endl; }
};
int main() {
Derived d;
return 0;
}
ผลลัพธ์
Base
แม้สร้าง object Derived แต่ Base::f() ถูกเรียก เพราะ vtable ยังไม่ถูกอัปเดตเป็นของ Derived ระหว่าง Base constructor ทำงาน