sususususu12 2024-04-06 16:21 采纳率: 43.8%
浏览 47

C++问题#include <iostream> using namespace std;


#include <iostream>
using namespace std;

class myobject {
public:
// 
补充
//
};

class producer : public myobject {
public:
    virtual void work() {
        counter = counter + 5;
        print_avaliable();
    }
};

int myobject::counter = 0;

int main(){
    producer *pro = new producer();
    myobject *con = new myobject();
    pro->work(); pro->work(); cout << endl;
    con->work(); con->work(); con->work(); cout << endl;
    pro->work(); cout << endl;
    con->work(); con->work(); cout << endl;
}

输出

5 10
6 2 2
7
3 3

  • 写回答

4条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题描述:

    阅读下面的代码,输出的结果是什么?为什么会这样输出?

    #include <iostream>
    using namespace std;
    
    class myobject {
    public:
        static int counter;
        virtual void work() {
            counter++;
            print_avaliable();
        }
    protected:
        void print_avaliable() {
            cout << counter << " ";
        }
    };
    
    class producer : public myobject {
    public:
        virtual void work() {
            counter = counter + 5;
            print_avaliable();
        }
    };
    
    int myobject::counter = 0;
    
    int main() {
        producer* pro = new producer();
        myobject* con = new myobject();
        pro->work(); pro->work(); cout << endl;
        con->work(); con->work(); con->work(); cout << endl;
        pro->work(); cout << endl;
        con->work(); con->work(); cout << endl;
    }
    

    输出结果:5 10 6 2 2 7 3 3

    解决方案:

    1. 函数重载与覆盖

    在本代码中,producer类重载了myobject类的虚函数work(),并且重新定义了counter的计算方式,因此当对象为producer类对象时,调用的work()函数是producer类的版本。而当对象为myobject类对象时,调用的是myobject类的版本。因此,输出的结果中,第一行的5和6分别来自producer类对象的两次work()调用,而10则来自myobject类对象的两次work()调用。

    1. 静态变量与静态成员函数

    counter是一个静态成员变量,因此该变量在类的所有对象中共享。在代码中,当产生myobject类对象和producer类对象时,counter是被共享的。而因为counter是静态成员变量,所以可以使用静态成员函数直接调用它,而不需要通过对象访问。在代码中,print_avaliable()是一个protected的成员函数,可以被子类访问。

    1. 运行内存的动态分配

    在代码中,producer和myobject类对象都是用new运算符在堆上动态分配的空间。因此,当调用完毕时,需要使用delete运算符来释放这些对象所占用的内存空间。否则,会产生内存泄漏的问题。

    修改后的代码:

    #include <iostream>
    using namespace std;
    
    class myobject {
    public:
        static int counter;
        virtual void work() {
            counter++;
            print_avaliable();
        }
    protected:
        void print_avaliable() {
            cout << counter << " ";
        }
    };
    
    class producer : public myobject {
    public:
        virtual void work() {
            counter = counter + 5;
            print_avaliable();
        }
    };
    
    int myobject::counter = 0;
    
    int main() {
        producer* pro = new producer();
        myobject* con = new myobject();
        pro->work(); pro->work(); cout << endl;
        con->work(); con->work(); con->work(); cout << endl;
        pro->work(); cout << endl;
        con->work(); con->work(); cout << endl;
    
        delete pro; // 释放动态分配的空间
        delete con;
    
        return 0;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月6日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画