weixin_39052352 2020-03-20 19:39 采纳率: 100%
浏览 565
已采纳

C++基类派生类继承输出问题!

#include
using namespace std;
class A{
public:
virtual void F(){cout << 1 << endl;}
void CallF(){F();}
virtual ~A(){CallF(); F();}
};

class B : public A{
public:
void F(){cout << 2 << endl;}
~B(){}
};

class C : public B{
public:
void F(){cout << 3 << endl;}
void CallF(){F(); A::CallF();}
~C(){CallF();}
};
int main(){
A * p = new C();
p->CallF();
delete p;
return 0;
}

代码输出结果为33311。
我的理解是delete p语句首先调用派生类C析构函数,然后调用基类B的析构函数,接着调用A的析构函数。
当调用C的析构函数时,会执行C类的CallF()函数,为什么这一步会输出两个3?
当调用A的析构函数,为什么会输出两个1?

  • 写回答

1条回答 默认 最新

  • 胖狗子修行之路 2020-03-20 19:57
    关注

    图片说明

    #include <iostream>
    
    using namespace std;
    
    class A{
    public:
    virtual void F(){cout << 1 << endl;}
    void CallF(){F();}
    virtual ~A(){
        cout << "a1" << endl;
        CallF(); F();
        cout << "a2" << endl;
        }
    };
    
    class B : public A{
    public:
    void F(){cout << 2 << endl;}
    ~B(){cout << "b" << endl;}
    };
    
    class C : public B{
    public:
    void F(){cout << 3 << endl;}
    void CallF(){F(); A::CallF();}
    ~C(){
        cout << "c1" << endl;
        CallF();
        cout << "c2" << endl;
        }
    };
    int main(){
    A * p = new C();
    p->CallF();
    cout << "delete -> start" << endl;
    delete p;
    return 0;
    }
    

    加上输出就好了,输出两个和没有输出不都是你代码没写吗?

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

报告相同问题?

悬赏问题

  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python