полиморфизм в C ++ - PullRequest
       8

полиморфизм в C ++

1 голос
/ 10 января 2011

Я пытаюсь реализовать следующие 2 функции

Number& DoubleClass::operator+( Number& x);
Number& IntClass::operator+(Number& x);

Я не уверен, как это сделать .. (их однонаправленность объясняется ниже):

   class IntClass;
   class DoubleClass;

class Number {
        //return a Number object that's the results of x+this, when x is either
        //IntClass or DoubleClass
        virtual Number& operator+(Number& x) = 0;
};


class IntClass : public Number {
    private:
        int my_number;
        //return a Number object that's the result of x+this.
        //The actual class of the returned object depends on x.
        //If x is IntClass, then the result if IntClass.
        //If x is DoubleClass, then the results is DoubleClass.
    public:
        Number& operator+(Number& x);
};


class DoubleClass : public Number {
    private:
        double my_number;
    public:

        //return a DoubleClass object that's the result of x+this.
        //This should work if x is either IntClass or DoubleClass
        Number& operator+( Number& x);
};

Ответы [ 2 ]

6 голосов
/ 10 января 2011

Вы не можете.

Проблема в том, что operator + возвращает новый объект , и вы не можете с чистой совестью возвратить ссылку - это обязательно будет либо свисающая ссылка, либоссылка на неуправляемую память кучи, которую вам нужно было бы освободить вручную.

В итоге этого нельзя сделать с помощью operator +.

2 голосов
/ 10 января 2011

Вам необходимо отделить полиморфизм от возвращаемого типа.Вы можете сделать это с помощью инкапсуляции.

Например:

class Number
{
    class NumberImpl
    {
    public:
        virtual ~NumberImpl(){}
        virtual NumberImpl* add(Number x) const = 0;
    };
    class IntClass;
    class DoubleClass;

    auto_ptr<NumberImpl> pimpl;
    Number(NumberImpl* p) : pimpl(p) {}

    //return a Number object that's the results of x+this, when x is either
    //IntClass or DoubleClass
public:
    Number operator+( const Number& x ) const { return Number(pimpl->add(x)); }
};


class Number::IntImpl : public Number::NumberImpl
{
private:
    int my_number;
public:
    //return a Number object that's the result of x+this.
    //The actual class of the returned object depends on x.
    //If x is IntImpl, then the result is new IntImpl.
    //If x is DoubleImpl, then the results is new DoubleImpl.
    virtual NumberImpl* add(Number& x) const;
};

class Number::DoubleImpl : public Number::NumberImpl
{
private:
    double my_number;
public:
    //return a new DoubleImpl object that's the result of x+this.
    //This should work if x is either IntImplor DoubleImpl
    virtual NumberImpl* add(Number& x) const;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...