背景信息
我已经用Java编程有一段时间了,仅在几个月前才切换到C++,所以如果我的答案只是我错过的愚蠢问题,请原谅!现在说完这些,是时候来看看手头的问题了!我正在开发一个基本的文本游戏引擎,最近遇到了一个有趣而特定的问题。我尝试在下面的程序中测试它,在屏幕上繁琐的代码可能让人眼花缭乱,而且问题也变得更加复杂,所以我决定只展示这个程序(而非我实际的游戏代码)。下面模拟的问题与我的实际代码中的问题相似,只是没有那些无关的因素。
问题描述
根本问题是多态性的问题。我想将输出运算符"<<"重载为一个独特的显示函数,以服务于继承层次结构中的每个对象。问题是,当我从存储这些继承成员的列表中调用这个运算符时,它们会失去自己的身份,并调用基类的输出运算符。通常,解决这个问题的方法是用一个简单的显示方法替换运算符重载,标记这个显示方法为虚方法,然后继续开心地做下去。我不介意对代码进行这样的修改,但现在我只是好奇,有没有一种方法可以重载继承层次结构中的运算符,以满足我的要求?
[示例] 代码
#include <vector>
#include <iostream>
#include <string>
using namespace std;
class Polygon {
friend ostream& operator<<(ostream& os, const Polygon& p);
public:
private:
};
class Rectangle : public Polygon {
friend ostream& operator<<(ostream& os, const Rectangle& r);
public:
private:
};
class Square : public Rectangle {
friend ostream& operator<<(ostream& os, const Square& s);
public:
private:
};
ostream& operator<<(ostream& os, const Polygon& p) {
os << "Polygon!" << endl;
return os;
}
ostream& operator<<(ostream& os, const Rectangle& r) {
os << "Rectangle!" << endl;
return os;
}
ostream& operator<<(ostream& os, const Square& s) {
os << "Square!" << endl;
return os;
}
int main() {
vector<Polygon*> listOfPoly;
listOfPoly.push_back(new Polygon());
listOfPoly.push_back(new Rectangle());
listOfPoly.push_back(new Square());
for(Polygon* p : listOfPoly) {
cout << *p;
}
}
[示例] 代码的输出结果
Polygon!
Polygon!
Polygon!
[示例] 代码的期望输出结果
Polygon!
Rectangle!
Square!
operator<<
是友元函数(而不是成员函数),所以简短的答案是否定的,你需要一个内部的显示运算符,并将其标记为虚拟的。 - vsoftcolistOfPoly.push_back(new Polygon());...
最好使用智能指针。 - PaulMcKenzie