作为初学者,我在模板,继承和纯虚函数方面存在一些问题。
考虑以下内容,其中Probability是一个实例化为RationalProbability的抽象模板。
Probability.h:
template <class T>
class Probability
{
public:
T value;
//Operator overloading for +
virtual Probability<T>* operator+(const Probability<T>& p);
T getValue() const { return value; }
protected:
Probability(T val) {
value = val;
}
~Probability() {};
};
Probability.cpp:空
RationalProbability.h:
#include "Probability.h"
class RationalProbability: public Probability<float>
{
public:
RationalProbability(float prob);
virtual ~RationalProbability();
RationalProbability* operator+(const RationalProbability& p);
};
RationalProbability.cpp:
#include "RationalProbability.h"
RationalProbability::RationalProbability(float prob): Probability(prob) {}
RationalProbability::~RationalProbability()
{
}
RationalProbability* RationalProbability::operator+(const RationalProbability& p) {
RationalProbability* rp = new RationalProbability(p.getValue() + this->value);
return rp;
}
我收到以下错误:
Error:undefined reference to
Probability<float>::operator+(Probability<float> const&)
确实没有具有该确切签名的函数,但RationalProbability完全使用
实现模板RationalProbability: public Probability<float>
答案 0 :(得分:3)
如果您希望基类具有抽象功能(您未实现的虚拟功能),您应该这样说:
virtual Probability<T>* operator+(const Probability<T>& p) = 0;
= 0
告诉编译器成员函数是一个必须被子类覆盖的抽象方法。
如果没有,那么必须是所有虚函数的定义(实现)。
如果您仔细查看错误消息,则表示缺少Probability<float>::operator+
,而不是RationalProbability::operator+
。
我还建议您read and check some canonical operator implementations,尤其是for the binary arithmetic operators,因为您不应该从operator+
函数返回指针。它应该按值返回一个对象。否则,如果突然一次添加的结果是一个指针,那么a + b + c
之类的东西会如何工作?