2017-02-09 53 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會如何工作?