Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Gọi hàm ảo (virtual) bên trong constructor trong C++


Gọi hàm ảo từ constructor hoặc destructor là nguy hiểm và nên tránh. Lý do: hàm ảo được gọi sẽ là của lớp Base, không phải lớp Derived.

Trong C++, mỗi lớp xây dựng bảng phương thức ảo (vtable) riêng trước khi vào constructor của nó. Vì vậy lời gọi hàm ảo trong constructor sẽ gọi phiên bản của Base. Nếu Base không có triển khai ở cấp đó, sẽ gây lỗi gọi hàm ảo thuần túy. Khi Base hoàn tất xây dựng, trình biên dịch bắt đầu xây dựng Derived và ghi đè con trỏ phương thức trỏ đến triển khai của Derived.

Ví dụ

#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;
}

Đầu ra

Base