笔试里面考C++基础遇到了好几次这种题目。先上代码
#include<iostream>
using namespace std;
class A
{
public:
A()
{
printf("A\n");
}
~A()
{
printf("~A\n");
}
virtual void fun()
{
printf("AA\n");
}
};
class B :public A
{
public:
B()
{
printf("B\n");
}
~B()
{
printf("~B\n");
}
virtual void fun()
{
printf("BB\n");
}
};
int main()
{
B b;
A *a=&b;
a->fun();
return 0;
}
问执行之后的结果。若对C++的继承有所了解,答案应该很快就出来了。我们分析一下:B b:构造一个类B的对象,因为它是继承于类A,所以先执行A中的构造函数,然后再执行自己的构造函数;A *a=&b:声明一个指向A类型的指针,并指向对象b;此时a->fun()执行的就是类B里面的fun();最后main将要将要结束,要析构函数。那么是先析构谁呢?
当然是B,因为B是A的子类,然后才再执行A的析构函数。因为从逻辑里面分析,构造的时候,要先有父亲才有儿子 先A后B,而析构的时候,要反过来,先从小的开始”删“。
执行结果是:
A
B
BB
~B
~A