我想用几个类编写小程序。
头等舱编号:
class Number
{
public:
virtual int compare(Number& a) = 0;
virtual string toString() = 0;
virtual void fillRandom() = 0;
};
继承自Number
的第二类Rationalclass Rational:Number
{
public:
int l;
int m;
Rational(int a, int b)
{
this->l = a;
this->m = b;
}
int compare(Rational a){} // here is the problem
string toString(){}
void fillRandom(){}
};
我理解为什么我有这个错误,我有一个纯虚方法int compare(Number& a)
,因此在所有子类中我必须有相同的方法。
但是,如果我将compare
参数更改为Number
,那么如果不在compare
中的某处将数字强制转换为Rational,它将无效。
有没有任何方法可以在没有施法的情况下进行?或者最好的方法是什么?
答案 0 :(得分:3)
首先,您需要有一些内容才能进行比较。它是什么?
a)Rational
只能与其他Rational
进行比较吗?或
b)不知何故Value(Rational())
vs Value(OtherNumber())
?其中
class OtherNumber : public Number
{
// Some code here
}
如果是,那么你需要考虑为什么把compare()
放入超类。
如果是b,那么你需要抽象其他函数,比如说
virtual long Value() const = 0;
并更改compare()
,以便它适用于Value()
:
virtual int compare(const Number& a)
{
// something about Value() and a.Value();
}
BTW,通常比较函数是const
函数。那就是:
virtual int compare ( const Number& a ) const;
另外,请记住将Number
扩展为public
,即
class Rational : public Number
否则你将失去多态行为。
答案 1 :(得分:0)
您可以使用以下签名(在基类和派生类中)(将虚拟声明保留在基础中):
int compare(const Number* a){}
所以基本上我的想法是使用指针而不是引用。这应该有效,您不必执行任何类型的转换来调用compare方法。
但是,使用上面的代码,您仍然需要在比较方法体中动态地将 Number 强制转换为Rational。此外,您必须考虑到可以与Number的任何子类调用比较,也许您对此行为不感兴趣。因此,您必须添加一些检查以确保您与不兼容的类进行比较。