背景情報
私はしばらく Java でプログラミングをしてきましたが、C++ に切り替えたのはほんの数か月前です。以上で、いよいよ本題です!私は基本的なテキスト ベースのゲーム エンジンを開発していますが、最近、興味深い具体的でありそうもない問題に遭遇しました。以下のプログラムで小規模にテストしてみましたが、(実際のゲーム コードとは対照的に) 画面を詰まらせず、問題の複雑さを軽減するために、(実際のゲーム コードとは対照的に) 表示することにしました。以下にモデル化された問題は、私の実際のコードの問題を反映していますが、ふわふわした邪魔者はありません。
問題
本質的に、問題はポリモーフィズムの 1 つです。出力演算子「<<」をオーバーロードして、階層内の各オブジェクトに固有の表示関数として機能させたいと考えています。問題は、これらの階層メンバーを格納するリストからこの演算子を呼び出すと、ID が失われ、基本クラスの出力演算子が呼び出されることです。通常、オペレーターのオーバーロードを単純な表示メソッドに置き換え、表示メソッドを仮想としてマークし、幸せな一日に進むことでこれを解決します。コードを変更することは特に気にしませんが、今は単純に興味があります。私がここで行っていることになる階層内の演算子をオーバーロードする方法はありますか?
【例】コード
#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!