C ++ наследование - неверная инициализация ссылочного типа - PullRequest
2 голосов
/ 07 июня 2011

Я написал следующий код:

class DoubleClass;
class IntClass;

class Number {
public:
    virtual Number& addInt(IntClass& x)=0;
    virtual Number& addDouble(DoubleClass& x)=0;
    virtual Number& operator+(Number& x) = 0;
};

class IntClass : public Number {
private:
    int num;
public:
    IntClass(int num) : num(num) { }
    Number& addInt(IntClass& x) { return x; }
    **Number& addDouble(DoubleClass& x) { return x; }**
    Number& operator+(Number& x) { return x; }
};

class DoubleClass: public Number {
private:
    double num;
public:
    DoubleClass(double num) : num(num) {}
    double get_number() { return num; }
    Number& addInt(IntClass& x) {
        return x;
    }
    Number& addDouble(DoubleClass& x) { return x; }
    Number& operator+(Number& x) { return x; }
};

Спасибо, Диего Севилья, я сделал то, что вы сказали, и это сработало.Еще один вопрос, я должен написать функцию: Number & add (Number & x, Number & y). Единственный способ реализовать это - сделать dynamic_cast для x и y для всех возможностей (приведение x и y к int, и еслигенерируется исключение, затем выполняется приведение x к удвоению и y к удвоению и т. д.), или есть более простой способ?

Ответы [ 2 ]

11 голосов
/ 07 июня 2011

В этот момент компилятор не знает, DoubleClass наследуется от Number.Вы должны отделить объявление класса от реализации метода.Например:

class IntClass : public Number {
// ...

  Number& addDouble(DoubleClass& x); // Note: no implementation
};

class DoubleClass : public Number
{
// ...
};

inline Number& IntClass::addDouble(DoubleClass& x) { return x; } // Won't fail now
1 голос
/ 07 июня 2011

Вы не определили DoubleClass, поэтому вы не можете ничего сделать со ссылкой, кроме как взять адрес объекта и передать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...