drawingourmoments 2022-05-12 20:23 采纳率: 100%
浏览 23
已结题

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

class A
{
public:
    A()
    {
        cout << "0";
    }
    virtual~A()
    {
        cout << "1";
    }
};

class B :public A
{
public:
    B()
    {
        cout << "2";
        buf = new char[10];
    }
    virtual ~B()
    {
        delete[]buf;
        cout << "3";
    }
private:
    char* buf;
};

int main()
{
    A a;
    B b;
    a = b;
    return 0;
}

答案是002311
这里的 a = b 起什么作用呢?
还有输出的最后一个1是怎么得到的呢?不是应该子类先析构 输出3,基类再析构 输出1 吗?为什么会多输出一个1呢?
麻烦各位看看 谢谢!!感激不尽!

  • 写回答

1条回答 默认 最新

  • 昂格莱德 2022-05-13 01:08
    关注

    a=b ; 单纯的调用合成拷贝赋值运算符进行拷贝,且拷贝的是父类的部分
    a构造输出0
    b先构造父类部分输出0,再构造子类部分输出2
    赋值拷贝无输出
    由于ab都是栈区变量,b后入栈先被析构,且先析构子类部分输出3,再析构父类部分输出1,a再析构输出1
    结果就是002311

    记住,先构造的后析构就行了(先入栈,后滚蛋)

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

报告相同问题?

问题事件

  • 系统已结题 5月21日
  • 已采纳回答 5月13日
  • 创建了问题 5月12日

悬赏问题

  • ¥20 用51单片机控制急停。
  • ¥15 孟德尔随机化结果不一致
  • ¥15 在使用pyecharts时出现问题
  • ¥15 深度学习残差模块模型
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用