Как переопределить методы при наследовании от класса, который использует шаблоны? - PullRequest
0 голосов
/ 26 октября 2018

У меня проблемы с попыткой выяснить, как правильно написать класс, который наследуется от класса, который использует шаблоны, а также переопределяет виртуальный метод.Когда я пытаюсь создать экземпляр этого класса, Visual Studio выдает мне сообщение о том, что

object of abstract type PropertyReal is not allowed: 
pure virtual function "Property<T>::propertyId [width t=qreal]" has no overrider

Это мой код

template <typename T>
class Property
{
    T  _value;

public:
    Property(T initValue);
    ~Property();

    virtual QString propertyId() = 0;

    virtual T value() { return _value; }
    virtual void setValue(T value) { _value = value; }
};


template<typename T> 
Property::Property(T initValue)
    :_value(initValue)
{
}


template<typename T> 
Property::~Property()
{
}




class PropertyReal : public Property<qreal>
{
    static const QString ID;

public:
    PropertyReal();
    ~PropertyReal();

    template <qreal>
    QString propertyId() { return ID; }
};

const QString PropertyReal::ID = "real";

PropertyReal::PropertyReal()
{
}

PropertyReal::~PropertyReal()
{
}



class RectComp : Component
{
public:
    static const QString ID;

    PropertyReal _width;

public:
    RectComp();
    ~RectComp();

    QString componentId() { return ID;  }
};

Ошибка возникает, когда я объявляюполе PropertyReal _width.Как бы это исправить?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018
QString propertyId() override { return ID; }

должен работать просто отлично.

См. Упрощенный пример: ideone

0 голосов
/ 26 октября 2018

Например:

class PropertyReal : public Property<qreal>
{
    static const QString ID;

public:
    PropertyReal();
    ~PropertyReal();

    // note: this is not a template!
    QString propertyId() override { return ID; }
};

override ключевое слово не обязательно, но добавление является хорошей практикой.

В вашем примере Property - этоне класс, а класс шаблон .Вы извлекаете PropertyReal из (неявно) экземпляра класса Property<qreal> - когда вы используете T в Property, вы должны использовать qreal в PropertyReal.

0 голосов
/ 26 октября 2018

Попробуйте удалить часть template <qreal>.

Пишите просто

QString propertyId() { return ID; }

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

Для других виртуальных методов

virtual T value() { return _value; }
virtual void setValue(T value) { _value = value; }

, которые зависят от параметра шаблона Tкласса Property, вы должны соответствовать параметру шаблона, который вы передали базовому классу.

Я имею в виду ... потому что PropertyReal наследуется от Property<qreal>, вы можете переопределить value() иsetValue() следующим образом

qreal value () { /* something */ }
void setValue (qreal value) { /* something */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...