C++多态笔试题

每次面试,基本都会遇到关于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的时候,就不会调用派生类的析构函数,所以运行的结果是:(这也就是为什么基类的析构函数需要定义成虚函数,为了能够正确释放派生类的对象)
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值