抽象类类型...是不允许的,纯虚函数不是覆盖

时间:2015-10-08 13:57:47

标签: c++

我想用几个类编写小程序。

头等舱编号:

class Number
{
public:
    virtual int compare(Number& a) = 0;
    virtual string toString() = 0;
    virtual void fillRandom() = 0;
};

继承自Number

的第二类Rational
class 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,它将无效。

有没有任何方法可以在没有施法的情况下进行?或者最好的方法是什么?

2 个答案:

答案 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的任何子类调用比较,也许您对此行为不感兴趣。因此,您必须添加一些检查以确保您与不兼容的类进行比较。