作为父类析构函数应当是虚函数,理由/场景和使用虚函数实现多态是一样的,但是默认的析构函数并不是默认被定义为虚函数的,因为当类中有虚函数的时候会额外开辟一定的内存存储指针和虚函数表。
我们通过实验说明析构函数需要为虚函数的场景
#include<iostream>
using namespace std;
class A{
//int maga;//有一个int为4 没有为1
public:
~A(){
cout<<"析构A"<<endl;
};
};
class B:public A{
public:
~B(){
cout<<"析构B"<<endl;
};//如果不虚化基类的析构函数,
};
void test01(A &b){
delete &b;//这样就是析构A
}
int main(){
B b;//只执行这一句就是自然释放b 所以析构b然后析构a
test01(b);
cout<<sizeof(A)<<" "<<sizeof(B);
}
正常运行只会析构A。
#include<iostream>
using namespace std;
class A{
//int maga;//有一个int为4 没有为1
public:
virtual ~A(){
cout<<"析构A"<<endl;
};
};
class B:public A{
public:
virtual ~B(){//此处是否添加关键字其实无所谓,因为一定是对析构函数的重写
cout<<"析构B"<<endl;
};//如果不虚化基类的析构函数,
};
class C:public B{
public:
~C(){
cout<<"析构C"<<endl;
}
};
void test01(A *b){
delete b;//这样就是析构A
}
int main(){
C c;//
test01(&c);
cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C);
}
一般情况下,在类中有指针成员的时候要写copy构造函数,赋值操作符重载和析构函数。