背景资料
我已经用 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!