Constructor gọi theo thứ tự từ trên xuống dưới (base → derived); destructor gọi ngược lại (derived → base).
class A {
public:
A() { std::cout << "A ctor\n"; }
~A() { std::cout << "A dtor\n"; }
};
class B : public A {
public:
B() { std::cout << "B ctor\n"; }
~B() { std::cout << "B dtor\n"; }
};
// Khi tạo B b: A ctor → B ctor
// Khi ra scope: B dtor → A dtorĐiểm cần nhớ:
- Nếu base class có destructor virtual, khi delete base_ptr destructor của derived class vẫn được gọi đúng.
- Nếu không virtual → undefined behavior khi xóa qua base pointer.
- Constructor không thể virtual (vì object chưa tồn tại khi gọi vtable).
Constructors are called top-down (base → derived); destructors are called in reverse (derived → base).
class A {
public:
A() { std::cout << "A ctor\n"; }
~A() { std::cout << "A dtor\n"; }
};
class B : public A {
public:
B() { std::cout << "B ctor\n"; }
~B() { std::cout << "B dtor\n"; }
};
// Creating B b: A ctor → B ctor
// Leaving scope: B dtor → A dtorKey points:
- If the base class destructor is virtual, delete base_ptr correctly invokes the derived destructor.
- If not virtual → undefined behavior when deleting through a base pointer.
- Constructors cannot be virtual (the object doesn't exist yet when vtable lookup would occur).