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

Tại sao C++ không có hàm tạo ảo (Virtual Constructor)?


Cơ chế ảo (virtual mechanism) chỉ hoạt động khi ta có con trỏ lớp cơ sở trỏ đến đối tượng lớp dẫn xuất.

Trong C++, hàm tạo (constructor) không thể là ảo, vì khi hàm tạo của một lớp được thực thi, chưa có bảng ảo (virtual table) trong bộ nhớ, nghĩa là con trỏ ảo (virtual pointer) chưa được định nghĩa. Do đó, hàm tạo luôn phải là non-virtual.

Nhưng hàm hủy ảo (virtual destructor) là có thể. Dưới đây là ví dụ:

Ví dụ

#include <iostream>
using namespace std;

class b {
public:
    b() { cout << "Constructing base \n"; }
    virtual ~b() { cout << "Destructing base \n"; }
};

class d : public b {
public:
    d() { cout << "Constructing derived \n"; }
    ~d() { cout << "Destructing derived \n"; }
};

int main(void) {
    d *derived = new d();
    b *bptr = derived;
    delete bptr;
    return 0;
}

Kết quả

Constructing base
Constructing derived
Destructing derived
Destructing base