【发布时间】:2015-04-17 05:00:35
【问题描述】:
class Eq
{
public:
virtual bool operator==(Eq operand) = 0;
};
class Day : public Eq
{
public:
enum DAY
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
} day;
Day(DAY init_day) : day(init_day){}
bool operator==(Day operand)
{
return day == operand.day;
}
};
int main()
{
Day d1(Day::Monday);
Day d2(Day::Monday);
d1 == d2;
return 0;
}
这是我试图实现的代码。 Eq 类就像 JAVA 的接口一样工作。它只有一个成员函数,operator==。 Operator== 采用一个与派生 Eq 类的类相同类型的操作数。例如Day类派生Eq,所以必须实现operator==,取Day类型参数。
还有问题。首先,两个 operator== 函数都有不同的签名。所以编译器认为它们不是相同的函数,而是被覆盖的函数。其次,如果此代码中的任何函数接受 Eq 类参数,则编译器会出错,因为抽象类的实例不可用。
这就是问题所在。如何使 T 类中的 operator== 函数获取 T 类参数,其中 T 是 Eq 类的实现?
【问题讨论】:
-
这是您想要实现的目标,还是一个示例?我的意思是,您不需要将
operator==设为纯虚拟来强制用户实现自己的operator==。由于没有默认的operator==,如果Day没有实现operator==,d1 == d2将无法编译。 -
你应该真正学会通过引用传递参数,而不是通过值。
-
我同意@KirilKirov 如果这就是你所做的一切,不要在这里为基类烦恼。还要使操作符成为 const 函数。
标签: c++ abstract-class