下午好🌅🌅🌅
本答案参考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
解决方案:
- 函数重载与覆盖
在本代码中,producer类重载了myobject类的虚函数work(),并且重新定义了counter的计算方式,因此当对象为producer类对象时,调用的work()函数是producer类的版本。而当对象为myobject类对象时,调用的是myobject类的版本。因此,输出的结果中,第一行的5和6分别来自producer类对象的两次work()调用,而10则来自myobject类对象的两次work()调用。
- 静态变量与静态成员函数
counter是一个静态成员变量,因此该变量在类的所有对象中共享。在代码中,当产生myobject类对象和producer类对象时,counter是被共享的。而因为counter是静态成员变量,所以可以使用静态成员函数直接调用它,而不需要通过对象访问。在代码中,print_avaliable()是一个protected的成员函数,可以被子类访问。
- 运行内存的动态分配
在代码中,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;
}