我很难弄清楚如何正确编写一个既可以从使用模板的类继承的类,又可以覆盖虚拟方法的类。当我尝试创建此类的实例时,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
时发生错误。我该如何解决?
答案 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)