从使用模板的类继承时,如何重写方法?

时间:2018-10-25 21:46:55

标签: c++ templates abstract-class pure-virtual

我很难弄清楚如何正确编写一个既可以从使用模板的类继承的类,又可以覆盖虚拟方法的类。当我尝试创建此类的实例时,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 :(得分:1)

尝试删除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 */ }

答案 1 :(得分:1)

赞:

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不是类,而是类 template 。您是从(隐式)实例化类PropertyReal派生Property<qreal>的-当您在T中使用Property时,应在{{1}中使用qreal }。

答案 2 :(得分:0)

QString propertyId() override { return ID; }

应该可以正常工作。

请参见简化示例:ideone