首页 > 试题广场 >

有代码如下所示,则在执行 delete p 时,控制台会输出

[单选题]
有代码如下所示,则在执行 delete p 时,控制台会输出什么内容()
class Base
{
     public:
         virtual ~Base(){
         	std::out<<"Base Destructor"<<std::endl;
       	}
}
class Derived: public Base
{
    public :
        ~Derived(){
        	std::out<<"Derived Destructor"<<std::endl;
        }
}
Base* p=new Derived();
delete p;
  • Base Destructor
  • Derived Destructor
  • Base Destructor
    Derived Destructor
  • Derived Destructor
    Base Destructor
我觉得最高票答案,把问题简单化了,析构的时候,的确是先调用派生类的析构函数、然后调用基类的析构函数。
但是我们要看这道题,这里还考了一个虚析构函数的考点,如果基类的析构函数不是虚函数,那么,像这种定义一个基类的指针,指向一个派生类的对象,当你delete这个基类的指针时,它仅调用基类的析构函数,并不调用派生类的析构函数。
如果基类的析构函数是虚函数,delete基类的指针时,不仅会调用基类的析构函数,还会调用派生类的析构函数。
而调用的顺序是先调用派生类的析构函数、然后调用基类的析构函数
发表于 2018-03-07 20:17:34 回复(16)
析构的时候:先调用派生类的析构函数、然后调用基类的析构函数;与构造函数相反。
发表于 2017-08-11 20:27:53 回复(6)
这是纯C++好嘛
发表于 2017-08-13 09:05:39 回复(0)
插个眼,简单理解,基类指针指向子类对象,delete该指针,若基类为虚析构函数,则先子后父调用析构函数;若基类析构函数不为虚,则单纯调用基类析构~
发表于 2021-04-28 19:27:49 回复(0)
这道题充分说明了,虚函数的动态性,只要我基类自己的某个函数不具有虚函数的性质,那么基类指向派生类永远在该函数上不具有动态性,也就是我只管我自己,我只能发挥我基类的作用。
发表于 2019-09-29 08:34:47 回复(0)
指针是指向基类的指针,应该只有基类构析函数会被调用,为何这里派生类的构析函数也被调用?
发表于 2017-08-18 23:32:56 回复(1)
delete父类指针,根据父类指针调用父类析构,此时子类空间不会回收。如果父类虚构为虚函数,此时回收子类空间,子类空间回收后自动检查父类剩余空间进行回收,避免内存泄漏
发表于 2023-08-11 10:22:49 回复(0)
如果Base析构函数不是虚函数,
Base* p = new Derived();
那么delete p时只运行Derived类的析构函数
#include <iostream>
class Base
{
public:
    ~Base() { std::cout << "Base Destructor " << std::endl; }
};
class Derived : public Base
{
public:
    ~Derived() { std::cout << "Derived  Destructor " << std::endl; }
};
int main()
{
    Base* p = new Derived();
    delete p;
}

只输出
Derived  Destructor
编辑于 2021-03-22 20:25:23 回复(2)
如果析构函数不是虚函数,
而程序执行时又要通过基类的指针去销毁派生类的动态对象,
那么用delete销毁对象时,
只调用了基类的析构函数,未调用派生类的析构函数。
这样会造成销毁对象不完全。

发表于 2020-04-26 01:50:59 回复(0)
当一个类对象建立时,先调用基类构造函数,在调子类构造函数,删除这个对象的时候,执行先构造后析构的原则。先调用子类的虚构函数,再调基类的析构函数。
发表于 2023-02-25 09:46:40 回复(0)
派生类先调用基类构造函数,如此递归,递归遵从后构造的先析构原则。
发表于 2022-09-15 14:46:04 回复(0)
学了JAVA搞成JAVA的
父子类了
发表于 2022-01-29 13:26:51 回复(0)
先调用派生类的析构函数、然后调用基类的析构函数;与构造函数相反。
发表于 2021-11-05 13:23:44 回复(0)
当基类的析构函数为虚函数的时候,delete基类的指针时,不仅会调用基类的析构函数,还会调用派生类的析构函数。
而当基类的析构函数不是虚函数的时候,仅会调用基类的析构函数
发表于 2021-03-23 08:41:05 回复(0)
先构造的后析构,后构造的先析构
发表于 2020-05-11 08:03:13 回复(0)

调用析构函数的顺序与调用构造函数的顺序相反

发表于 2020-02-27 11:27:20 回复(0)
c++
发表于 2019-11-08 08:10:23 回复(0)
基类的析构函数是虚函数,所以先调用派生类的析构函数 再调用基类的析构函数
发表于 2019-04-06 13:35:17 回复(0)

基类的虚构函数是虚函数,则是先调用子类的虚构函数,后是基类的虚函数

发表于 2019-04-05 13:05:06 回复(0)
虚析构函数
发表于 2018-08-26 23:01:16 回复(0)