关于#java#的问题:问题描述:为什么当我把虚函数`seta`删掉时,程序会无限输出1,但是当我去掉`[]`时程序的运行结果是正确的

该问题来自社区帖: 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,但是当我去掉`[]`时程序的运行结果是正确的?不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我无法根据参考资料回答这个问题,因为参考资料中并没有关于seta函数和无限输出1的相关信息。请提供更多的背景信息和相关代码,以便我能够给出具体的解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

当你将虚函数seta从类people中删除时,people和stu之间的继承关系就不再是多态的,也就是说,people和stu之间没有了动态绑定的能力,即使你将一个stu对象赋给一个people*类型的指针,也只能调用people类中的成员函数,无法调用stu类中重写的成员函数。

当你删除虚函数seta并运行程序时,程序在执行delete []p语句时会调用people类的析构函数,而不会调用stu类的析构函数,因为p指向的对象的实际类型是stu,但是p的类型是people*,因此只能调用people类的析构函数,这就导致了程序的行为不一致。

当你去掉[]后,程序只会调用一次delete,因此只会执行一次析构函数,不会出现无限输出1的情况。