我目前正在实现 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
为什么是这样?我如何需要更改它以使运算符也重载?为什么我必须继承“public”才能访问“isEqual”方法?或者这只是迄今为止我没有使用(也不知道)的模板的典型情况?
我正在做的是实现不同的 SubLbl 类,以支持我可以放在对象上的不同类型的标签。所有(SubLbl 类)都从 Lbl 类继承,并且由于它们自己的相等定义而应该重载相等运算符(int 比较不同于两个复杂对象的比较,甚至不同于双重比较)。后来(在程序中)我不想知道我现在在看什么样的子标签,我只想知道它们是否相等。