現在、C++ でラベル付けサポート用のクラスを実装しています。ただし、オーバーロードされた演算子と isEqual メソッドの異なる動作について少し混乱しています。
class Lbl
{
public:
virtual bool operator == (const Lbl* l) const = 0;
virtual bool isEqual (const Lbl* l) const = 0;
};
class SubLbl : public Lbl
{
public:
SubLbl(){}
bool operator == (const Lbl* l) const {return true;}
bool isEqual (const Lbl* l) const {return true;}
};
int main(int argc, char** argv) {
SubLbl* l1 = new SubLbl();
SubLbl* l2 = new SubLbl();
cout << (l1 == l2) << endl;
cout << (l1->isEqual(l2)) << endl;
return 0;
}
出力:
0
1
どうしてこれなの?オペレーターもオーバーロードするには、これをどのように変更する必要がありますか? 「isEqual」メソッドにアクセスできるようにするために「public」を継承する必要があるのはなぜですか? それとも、これまでに使用したことのない (そして知らない) テンプレートの典型的な状況ですか?
私がやっていることは、オブジェクトに付けることができるさまざまなタイプのラベルをサポートするために、さまざまな SubLbl クラスを実装することです。すべて (SubLbl クラス) は Lbl クラスから継承し、独自の等値定義により等値演算子をオーバーロードする必要があります (int 比較は 2 つの複雑なオブジェクトの比較とは異なり、さらに double 比較とは異なります)。後で(プログラムで)現在どのようなサブラベルを見ているのか知りたくありません。それらが等しいかどうかを知りたいだけです。