Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีเรียก virtual function ภายใน constructor ใน C++


เตือน: การเรียก 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 ทำงาน