首页 > 试题广场 >

下面这段代码会打印出什么?

[单选题]
下面这段代码会打印出什么?
#include <stdio.h>
class A {
  public:
    A() { printf("A"); }

    ~A() { printf("deA"); }
};

class B {
  public:
    B() { printf("B"); }
    ~B() { printf("deB"); }
};

class C : public A, public B {
  public:
    C() { printf("C"); }
    ~C() { printf("deC"); }
};
int main() {
    A *a = new C();
    delete a;
    return 0;
}


  • A B C deA
  • C A B deA
  • A B C deC
  • C A B deC
推荐
答案 A
解释:
构造函数的执行先执行父类,再执行子类。析构顺序想反

A B的析构函数不是虚函数,所以不会执行子类的虚函数。 
编辑于 2015-01-27 17:28:27 回复(3)
/* virtual */ 妈的,居然是注释。。。。
发表于 2016-04-14 21:00:17 回复(1)
难道我眼睛瞎了?
为什么我没看到有virtual!!!!
发表于 2017-09-30 21:47:20 回复(5)
整个代码添加一行:#include  <stdio.h>
即可完整的运行,运行结果如下:
发表于 2016-08-23 16:52:38 回复(0)
A. A B C  deA
发表于 2015-01-26 20:54:57 回复(0)
构造函数在创建对象的时候调用,先调用父类,再子类,析构相反
(1)当父类的指针new一个子类的对象时,
父类析构不是虚析构,则delete的时候不调用子类的,只是调用父类的析构函数,如果是virtual的析构函数,则先子类之后父类
(2)当子类的指针new一个子类的对象时,构造析构都会调用父类
-------------------------------------------------------------------------------------------------------------------
A *a = new C();是调用父类的指针new一个子类的对象
即:A B C deA 
若A中的析构函数是virtual,则A B C deC  deB  deA 
-------------------------------------------------------------------------------------------------------------------bryant_xw
B *b = new C(); 即:A B C deB 
若B中的析构函数是virtual,则A B C deC  deB  deA 
-------------------------------------------------------------------------------------------------------------------
 C *c = new C();子类的指针new一个子类的对象,先构造(父->子)后析构(子->父)
结果A B C deC deB deA

发表于 2018-06-10 23:05:44 回复(7)
如果按题中所说 加入virtual,那么输出的顺序是ABC deC deB deA。由于析构函数是虚函数,动态调用,那么会调用C的析构函数,由于C继承与A和B,所以先调用A B的析构,最后调用自己的。
如果A的析构函数不是虚函数,那么只会调用A的析构函数。
发表于 2016-07-29 22:31:48 回复(7)
说注释坑人的自己反思,认真脸
发表于 2017-01-01 14:48:15 回复(0)
程序在结束的时候会首先调用派生类C的析构函数,然后再调用基类的析构函数。
如果基类的析构函数不是虚函数,而当程序执行时又要通过基类的指针去销毁派生类的动态对象,
那么在用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。 

发表于 2018-07-12 20:41:24 回复(0)
没有虚继承,基类指针只能调用基类的析构函数
发表于 2016-09-04 23:09:42 回复(0)
····A类中还特别标注virtual,以为意思是说A的析构函数时虚函数····
不是虚析构函数就什么都别标注啊···········
发表于 2015-12-13 20:26:29 回复(3)
为什么c++的题跑到了c的专项训练
发表于 2022-05-17 20:47:36 回复(0)

如果改成C *a = new C() ;

结果就是:  A B C deC deB deA

发表于 2018-07-07 11:02:13 回复(0)
存在继承关系且基类的析构函数不是虚函数时,delete基类指针只会释放基类空间,子类不释放,容易造成内存泄漏
发表于 2018-06-08 10:51:23 回复(0)
构造函数在创建对象的时候调用,先调用父类,再子类,析构相反
(1)当父类的指针new一个子类的对象时,
父类析构不是虚析构,则delete的时候不调用子类的,只是调用父类的析构函数,如果是virtual的析构函数,则先子类之后父类
(2)当子类的指针new一个子类的对象时,构造析构都会调用父类
-------------------------------------------------------------------------------------------------------------------
A *a = new C();是调用父类的指针new一个子类的对象
即:A B C deA 
若A中的析构函数是virtual,则A B C deC  deB  deA 
-------------------------------------------------------------------------------------------------------------------bryant_xw
B *b = new C(); 即:A B C deB 
若B中的析构函数是virtual,则A B C deC  deB  deA 
-------------------------------------------------------------------------------------------------------------------
 C *c = new C();子类的指针new一个子类的对象,先构造(父->子)后析构(子->父)
结果A B C deC deB deA
发表于 2022-09-06 14:36:56 回复(0)
构造函数从基类开始
基类析构函数不是虚函数 只执行基类析构函数
发表于 2022-03-14 09:30:56 回复(0)
c++中虚构函数vitural,没有这个就鄙视虚构函数。先执行基类函数再执行继承类函数
发表于 2021-03-27 12:03:05 回复(0)

不是虚析构函数,所以只调用了A的

发表于 2020-03-05 20:14:54 回复(0)

考察点:构造函数和析构函数的顺序,构造函数是按照先执行父类到子类,析构函数则是先执行


发表于 2019-06-22 14:14:54 回复(0)
析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
发表于 2018-08-13 16:02:12 回复(0)
虚析构函数的考点
发表于 2017-07-19 11:33:16 回复(0)