第一种代码:基函数析构函数无virtual
#include<iostream>
class A {
public:
A() {
printf(" 创建A \n");
}
~A() {
printf(" 销毁A \n");
} // 增加了虚拟关键字
};
class B : public A
{
public:
B() {
printf("创建B \n");
}
~B() {
printf("销毁B \n");
}
};
int main(int argc, char* argv[])
{
A* a = new B;
delete a;
getchar();
return 0;
}
执行结果:
第二种代码:基函数析构函数有virtual
#include<iostream>
class A {
public:
A() {
printf(" 创建A \n");
}
virtual ~A() {
printf(" 销毁A \n");
} // 增加了虚拟关键字
};
class B : public A
{
public:
B() {
printf("创建B \n");
}
~B() {
printf("销毁B \n");
}
};
int main(int argc, char* argv[])
{
A* a = new B;
delete a;
getchar();
return 0;
}
运行结果:
3.子类对象初始化
#include<iostream>
class A {
public:
A() {
printf(" 创建A \n");
}
virtual ~A() {
printf(" 销毁A \n");
} // 增加了虚拟关键字
};
class B : public A
{
public:
B() {
printf("创建B \n");
}
~B() {
printf("销毁B \n");
}
};
int main(int argc, char* argv[])
{
B* a = new B;
delete a;
getchar();
return 0;
}
运行结果:
结论:析构函数本应该设置成虚函数。在父类指针指向子类对象做对象销毁时,由于析构函数不是虚函数,则delete时,父类指针只能调用父类自己的析构函数,这就造成了上述对象部分销毁的错误状况。
参考:
1.https://blog.csdn.net/z735640642/article/details/84351451
2.https://blog.csdn.net/weixin_39731083/article/details/81739340