该问题来自社区帖:
https://bbs.csdn.net/topics/615685611.为符合问答规范, 该问题经过ChatGPT优化
问题描述:为什么当我把虚函数`seta`删掉时,程序会无限输出1,但是当我去掉`[]`时程序的运行结果是正确的,为什么之前那两种情况会错? ``` #include using namespace std; class people { public: int a; virtual void seta(int b) { } ~people() { cout << "1"<< endl; } }; class stu:public people { public: int a; void seta(int b) { a = b; } ~stu() { cout << "2" << endl; } }; int main() { people a; people* p = new stu; delete []p; } ``` 优化后的问题:为什么当我把虚函数`seta`删掉时,程序会无限输出1,但是当我去掉`[]`时程序的运行结果是正确的?不知道你这个问题是否已经解决, 如果还没有解决的话:
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
当你将虚函数seta从类people中删除时,people和stu之间的继承关系就不再是多态的,也就是说,people和stu之间没有了动态绑定的能力,即使你将一个stu对象赋给一个people*类型的指针,也只能调用people类中的成员函数,无法调用stu类中重写的成员函数。
当你删除虚函数seta并运行程序时,程序在执行delete []p语句时会调用people类的析构函数,而不会调用stu类的析构函数,因为p指向的对象的实际类型是stu,但是p的类型是people*,因此只能调用people类的析构函数,这就导致了程序的行为不一致。
当你去掉[]后,程序只会调用一次delete,因此只会执行一次析构函数,不会出现无限输出1的情况。