2017-02-09 50 views
1

作为初学者,我在模板,继承和纯虚函数方面存在一些问题。专业纯虚拟模板功能的另一个问题(未定义参考)

请考虑以下情况,其中概率是作为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; 
} 

我得到以下呃ROR:

Error:undefined reference to 
    Probability<float>::operator+(Probability<float> const&) 

这是事实,不存在具有该确切签名无功能,但RationalProbability与

RationalProbability: public Probability<float> 
+2

您没有指定纯虚拟函数,因此预计会有实现。 –

+3

并且'operator +()'返回一个指向动态分配对象的指针.... blech !!!这不是Java。 – Peter

回答

3

如果你想有一个基类有一个抽象功能正是实现模板(你不实现虚拟函数),你应该这么说:

virtual Probability<T>* operator+(const Probability<T>& p) = 0; 

= 0就是告诉补偿iler说成员函数是一个必须被子类重写的抽象方法。

如果您没有,那么必须是所有虚函数的定义(实现)。


如果你看一下错误信息更接近它说,它的Probability<float>::operator+是缺少,不RationalProbability::operator+

我也建议你read and check some canonical operator implementations,尤其是for the binary arithmetic operators,因为你不应该返回从operator+函数的指针。它应该返回值为的对象。否则,如果突然一个加法的结果是一个指针,a + b + c会如何工作?