每次面试,基本都会遇到关于C++多态的问题,昨天笔试遇到的这道关于多态的笔试题,感觉考察很全面,特意写篇博客记载一下,以后要是混淆了,还可以再找出来看看,同时也希望可以帮助到其他求职的朋友不要在这种题上面失分。
下面代码是完整的部分,可以直接拷贝编译运行:
#include <iostream>
using namespace std;
int i = 0;
int arr[6] = {0};
class Base
{
public:
Base() {arr[i++] = 10;}
virtual ~Base() {arr[i++] = 5;}
virtual void foo() {arr[i++] = 7;}
void bar() {arr[i++] = 1;}
virtual void time() {arr[i++] = 6;}
};
class Derived : public Base
{
public:
Derived() {arr[i++] = 8;}
virtual ~Derived() {arr[i++] = 50;}
virtual void foo() {arr[i++] = 14;}
void bar() {arr[i++] = 4;}
};
int main(int argc, char *argv[])
{
Base *pb;
i = 0;
pb = new Derived;
pb->foo();
pb->bar();
delete pb;
for(int j = 0; j <6; j++)
{
printf("arr[%d] = %d\n", j,arr[j]);
}
return 0;
}
运行结果如下:
第一步,调用基类的构造函数,所以arr[0] = 10;
第二步,调用派生类的构造函数,所以arr[1] = 8;
第三步,调用派生类的foo()函数,所以arr[2] = 14;
第四步,调用基类的bar()函数,所以arr[3] = 1;
第五步,调用派生类的析构函数,所以arr[4] = 50;
第六步,调用基类的析构函数,所以arr[5] = 5;
注意:基本原则,构造的时候,先调用基类构造函数,再调用派生类构造函数;
析构的时候,反过来,先调用派生类的析构函数,再调用基类的析构函数。
如果基类的析构函数前面没有加virtual关键字,在delete pb的时候,就不会调用派生类的析构函数,所以运行的结果是:(这也就是为什么基类的析构函数需要定义成虚函数,为了能够正确释放派生类的对象)