C++ 中的虚析构器
基类中的析构器可以是虚函数。每当完成向上转换时,基类的析构器必须是虚拟的,以便在程序退出时正确地销毁对象。
注意: 构造器永远不是虚的,只有析构器可以是虚的。
C++ 中不带虚析构器的向上转换
让我们首先看看当我们没有虚拟基类析构器时会发生什么。
class Base
{
public:
~Base()
{
cout << "Base Destructor\n";
}
};
class Derived:public Base
{
public:
~Derived()
{
cout<< "Derived Destructor\n";
}
};
int main()
{
Base* b = new Derived; // Upcasting
delete b;
}
摧毁基地
在上面的例子中,delete b
将只调用基类析构器,这是不可取的,因为派生类的对象仍然没有被构造,因为它的析构器从未被调用过。这会导致内存泄漏。
C++ 中虚析构器的向上转换
现在让我们看看。当我们在基类中有虚析构器时会发生什么。
class Base
{
public:
virtual ~Base()
{
cout << "Base Destructor\n";
}
};
class Derived:public Base
{
public:
~Derived()
{
cout<< "Derived Destructor";
}
};
int main()
{
Base* b = new Derived; // Upcasting
delete b;
}
派生析构器基析构器
当基类中有虚析构器时,首先调用派生类的析构器,然后调用基类的析构器,这是期望的行为。
C++ 中的纯虚析构器
- 纯虚析构器在 C++ 中是合法的。此外,必须定义纯虚析构器,这与纯虚拟行为相反。
- 虚析构器和纯虚析构器的唯一区别是,纯虚析构器将使其基类抽象,因此您不能创建该类的对象。
- 不需要在派生类中实现纯虚析构器。
class Base
{
public:
virtual ~Base() = 0; // Pure Virtual Destructor
};
// Definition of Pure Virtual Destructor
Base::~Base()
{
cout << "Base Destructor\n";
}
class Derived:public Base
{
public:
~Derived()
{
cout<< "Derived Destructor";
}
};