百度试题 结果1 题目C++将父类的析构函数定义为虚函数,下列正确的是哪个? A. 释放父类指针时能正确释放子类对象 B. 释放子类指针时能正确释放父类对象 C. 这样做是错误的 D. 其他全错 相关知识点: 试题来源: 解析 A. 反馈 收藏
将父类的析构函数改为虚函数,就可以避免这种情况。 程序运行截图: 从程序的运行结果可以看出,父类和子类的内存都被析构了。所以在使用多态时一定要将父类的析构函数定义成虚函数,从而避免内存泄露。
如果基类的析构函数,我定义为虚析构(virtual ~A()),那这样多态失效的原因就更容易理解了: 因为此时对象析构的顺序是 先派生类析构->基类析构.在基类析构~A()中调用foo()之时,派生类对象就已经完蛋了,B中资源都已释放,如果实现多态而调用B::foo(),那将会有未定义行为.所以编译器没有那么做. 同理,构...
下列函数为虚函数的是:B.析构函数。 析构函数可以声明为虚函数,允许通过基类的指针或引用来调用派生类的析构函数,以确保正确的析构顺序。构造函数可以为虚函数,但通常不建议,因为构造函数在对象创建时就被调用,此时多态性[3]可能无法正确工作。拷贝构造函数也可以声明为虚函数,但它不常见。静态成员函数不能声明...
问题在于getTimeKeeper返回一个指向派生类对象的指针(AtomicClock),这个对象通过一个基类指针(一个TimeKeeper*指针)来进行释放(delete),基类中(TimeKeeper)有一个非虚析构函数。这是造成灾难的一个因素,因为c++指出:通过一个基类的指针来释放一个派生类的对象,如果基类的析构函数是非虚的,那么结果未定义。在运行时有...
十三、 构造函数为什么一般不定义为虚函数?而析构函数一般写成虚函数的原因 ? 1、构造函数不能声明为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等 ...
在Human类的实现里,在成员函数的前面加了virtual关键字,则将eating函数就变成了虚函数,Human的eating方法变成了虚函数,那么EnglishMan类和chinese类的eating方法也变成了虚函数。引入了虚函数之后,我们继续执行上述所示的代码,结果如下所示: image-20210220105143829 ...
1. 虚函数不能是静态成员函数,或友元函数,因为它们不属于某个对象。 2. 内联函数不能在运行中动态确定其位置,即使虚函数在类的内部定义,编译时,仍将看作非内联。 3. 构造函数不能是虚函数,析构函数可以是虚函数,而且通常声明为虚函数。 C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并...
关于虚函数,下列表述中错误的是( )。 A. 析构函数可以声明为虚函数 B. 构造函数可以声明为虚函数 C. 通过指针或引用对虚函数的调用称为多态调用 D. 虚函数在派生类重定义后仍然是虚函数,可以进一步重定义 相关知识点: 试题来源: 解析 B 反馈 收藏 ...