前言:
c++ 抽象类为什么要实现虚析构?
这个问题是面试官经常会问的 可能c++基础不扎实的会懵逼 连什么是抽象类都不清楚
什么是抽象类?
先看一下抽象类的定义
抽象类:声明了纯虚函数的类,都成为抽象类
主要特点:抽象类只能作为基类来派生新类,不能声明抽象类的对象。(既然都是一个抽象概念了,纯虚函数没有具体实现方法,故不能创造该类的实际的对象)
什么又是纯虚函数?
形式:virtual 函数原型=0;
定义:在定义一个表达抽象概念的基类时,有时无法给出某些函数的具体实现方法,就可以将这些函数声明为纯虚函数。
特点:无具体实现方法。
下面这个就是抽象类
/// 抽象的汽车类 ///
class abstractCar
{
public:
virtual void name() = 0; /// 纯虚函数 不做具体的实现
virtual void price()= 0; /// 纯虚函数
};
要详细了解抽象类移步其他文章 这里不多解释,主要看抽象类为什么要实现虚析构
看下面的代码
/// 抽象的汽车类 ///
class abstractCar
{
public:
virtual void name() = 0;
virtual void price()= 0;
~abstractCar()
{
cout << "~abstractCar" << endl;
}
};
/// 派生宝马类
class bmw : public abstractCar
{
public:
void name()
{
std::cout << " i am bmw" << std::endl;
}
void price()
{
std::cout << " price : 500000" << std::endl;
}
~bmw()
{
cout << "~ bmw " << endl;
}
};
int main()
{
abstractCar* car = new bmw();
car->price();
car->name();
delete car;
return 0;
}
这里我们实现了抽象的汽车类 然后写了派生宝马类继承这个抽象类 实现多肽
动态多肽是在运行时才选择的
abstractCar* car = new bmw();
理论上 应该是 先基类的构造 派生类的构造
然后 delete 以后 是先派生类的析构 在 基类的析构
delete 以后没有执行 派生宝马类的 析构 为什么?
这样就导致内存泄露了
当他们删除它时,如果析构函数是非虚拟的,他们将调用接口的析构函数(或者编译器提供的默认值,如果没有指定),而不是调用派生类的析构函数。
我们这个里改一下代码 把基类的析构 改为虚析构
这样就可以了
我看网上很多人争论说 要不要实现虚析构 视情况而定 这个不实现也没问题, 这里就不参加争论了
我们只是说 c++ 抽象类为什么要实现虚析构?
因为不实现会照成 析构时 子类不析构 照成内存泄露