首页 > 试题广场 >

下面这段程序的输出是什么?

[单选题]
下面这段程序的输出是什么?
#include<stdio.h>
class A{
    public:
        A(){ p(); }
        virtual void p(){ printf("A"); }
        virtual ~A(){ p(); }
};
class B:public A{
    public:
        B(){ p(); }
        void p(){ printf("B"); }
        ~B(){ p(); }
};
int main(int, char**){
        A* a = new B();
        delete a;
}
  • AABB
  • BBAA
  • ABAB
  • ABBA
推荐
题目想构造一个B类的对象,B继承自A,所示首先构造A,A中构造函数调用P,虽然P是虚函数,按理来说应该动态绑定,但是此时B并没有被构造,所以只能调用自己的P函数(输出A),接下来构造B,调用B的P函数(输出B),接着析构从派生类到基类,首先析构B,调用B的P函数(输出B),接着调用A的析构函数,按理来说应该动态绑定,但是此时B已经被析构,所以只能调用自己的P函数(输出A)。

解释就是上面的,但是C++不推荐在构造/析构函数中调用虚函数进行动态绑定,详情请看Effective C++。
编辑于 2016-06-01 14:38:08 回复(2)
构造函数和析构函数是无法实现多态性的。理由是:
1.构造函数中,先构造父类,再构造子类,父类构造函数中调用函数,此时子类还没有构造,怎么实现多态性?
2.析构函数中,先析构子类,再析构父类。当我们在一个类中执行析构函数时,它的派生类都已经析构了,自然无法实现多态性。
所以答案就是:ABBA
发表于 2017-01-10 11:50:33 回复(2)
这里考察的是构造过程和析构过程。
B构造时,首先基类构造函数工作,构造基类的成员变量,然后在构造继承类即B的成员变量。在析构的时候切好相反。首先析构继承类即子类,然后在析构基类。即B的析构函数先工作,A的析构函数后工作。
发表于 2017-02-20 21:18:19 回复(1)
mlc头像 mlc
D 虚析构函数的考察,先析构子类,再析构父类
发表于 2015-04-12 10:06:01 回复(0)
这里A的析构函数也是虚函数,是因为如果不是虚函数的话,会采用静态联编,调用delete时只是调用了基类A的析构函数而不会调用B的析构函数;所以要使用动态联编,告诉编译器到时候delete时,要根据运行时的对象来调用实例的析构函数,于是需要使用虚析构函数,而基类的析构函数为虚函数时,其所有派生类的析构函数即便不加virtual也是虚函数。
编辑于 2023-03-02 19:43:23 回复(0)
构造函数先构造父类,再构造子类, 析构函数先析构子类,再析构父类!
发表于 2020-07-06 23:58:43 回复(0)
Effective C++的条款9有说到,在子类构造和析构期间,编译器将它看做是 base class,而不是derived class。
发表于 2018-12-19 22:08:46 回复(1)
考察的是继承关系中,创建对象调用基类与子类构造函数顺序,先父后子,以及销毁对象时调用基类与子类析构函数顺序,先子后父。是相反的关系。
发表于 2018-11-13 12:36:40 回复(0)
先构造的后析构
发表于 2017-10-17 19:22:19 回复(0)
构造析构,从外到里,从里到外。类似于汉诺塔,大盘先放,小盘后放。小盘先拿,大盘后拿。
发表于 2018-03-18 15:24:04 回复(0)
虚函数实现多态是在构造之后,构造中会产生虚函数指针和虚函数表。

B先构造子类,在构造父类。
A中构造中调用虚函数p,未产生虚函数指针以及虚函数表,调用自身的p。B中构造调用p,调用B中的p。
delete a;
先析构子类,在析构父类。
析构子类调用自身的p,析构父类的时候,子类中的p已经被释放掉,只能调用父类的p

发表于 2023-11-07 21:43:42 回复(1)
构造函数和析构函数中都不能实现多态
发表于 2023-07-23 21:47:54 回复(0)
A* a=new B();这是分配B函数吧,,,,,,,,,,,,,,,,哪里是对象。。。。。
发表于 2018-08-18 17:14:20 回复(1)

这一题并不是考察虚函数继承问题,因为并不是基类指针或引用指向派生类对象,因此无法实现多态性。

发表于 2017-05-03 22:54:13 回复(3)
调用基类,在调用子类的构造函数,析构的时候先调用子类的,在调用基类的。
a类中的p()函数是虚函数。但是此时构造函数没有完全初始化,所以还是调用基类自己的p()函数,同理子类的虚函数
发表于 2015-08-01 12:12:51 回复(0)
D
发表于 2015-01-06 12:21:28 回复(0)