drawingourmoments 2022-05-10 23:33 采纳率: 100%
浏览 41
已结题

一道c++ 继承相关程序阅读题


#include<iostream>
#include<cstring>
class Base
{
    char* base;
public:
    Base()
    {
        base = new char[2];
        strcpy(base, "1");
        cout << "2";
    }
    ~Base()
    {
        delete[]base;
        cout << "3";
    }
    void Print()
    {
        cout << base;
    }
};

class Derived :public Base
{
    char* derived;
public:
    Derived()
    {
        derived = new char[2];
        strcpy(derived, "4");
        cout <<"5";

    }
    ~Derived()
    {
        delete[]derived;
    }
    
};

int main()
{
    Base* ptr = new Derived;
    ptr->Print();
    delete ptr;
    return 0;
}

答案是2513
Base* ptr = new Derived; 是什么意思呀?Derived不是类的名称吗 为什么会被new创建出来呢?
还有ptr->Print();调用的为什么是基类中的函数呢?(输出的是1)
最后delete ptr; 又为什么调用的是基类的析构函数呢?析构不是派生类先调用吗?
麻烦各位看看解答一下疑惑,谢谢!!感激不尽!!

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-05-11 00:28
    关注

    1、Derived是类名,也可以看作是变量的类型名,类比 int 来理解。new Derived就是在堆上创建一个Derived类的实例。Base* ptr = new Derived;就是用基类指针指向派生类对象。
    2、Print()是基类的成员函数,而且不是虚函数,此时就是基类指针ptr调用基类函数Print()。
    3、ptr是基类指针指向派生类对象,这种情况只会调用基类析构。可以理解为ptr认为它所指向的内存是一个基类实例,就只能看到基类的成员变量和函数,所以不会调用派生类析构。正常情况是派生类指针指向派生类对象,那么就先调用派生类析构再调用基类析构。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 修改了问题 5月10日
  • 创建了问题 5月10日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 深度学习残差模块模型
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)