2012-01-03 159 views
-2

我有一個抽象基類的純和混凝土虛擬方法的混合,例如混凝土虛擬方法:C++使用抽象基類

template < class T > class A { 
    public: 
    A () { } 
    virtual ~A () { } 

    virtual void purefunc(const T & a, T & b) const = 0; 
    virtual T concretefunc (const T & a) { 
     T b;     // requires new memory allocation for b 
     purefunc(a, b); 
     return b; 
    } 
}; 

而且它實現了純虛函數,例如派生類:

template < class T > class B : public A <T> { 
    public: 
    B (T c) : c_(c) { } 
    ~B () { } 

    void purefunc(const T & a, T & b) const { 
     b = c_ * a;    // uses memory of b without reallocation 
    } 

    private: T c_; 
}; 

有人能解釋我如何調用混凝土基方法時,我有子類的對象,沒有類型轉換成抽象基類的多態指針(如果可能的話):

int a = 2, b; 
B<int> B_obj(2); 
b = B_obj.concretefunc(a); //!! doesn't work: 'no matching function for call' 

B<int> * B_ptr = &B_obj; 
b = B_ptr->concretefunc(a); //!! doesn't work either: 'no matching function for call' 

A<int> * A_ptr = &B_obj; 
b = A_ptr->concretefunc(a); //!! works, but explicit type casted isn't very intuitive 

非常感激的任何解釋或幫助!

編輯:增加公衆量詞, 嗯,這個僞代碼工作正常。會去檢查什麼在我的實際代碼不同...

編輯2:發現我的問題:我用同樣的名稱purefunc和concretefunc互爲重載。因此,如果你寫:

virtual void func(const T & a, T & b) const = 0; 
virtual T func (const T & a) { ... } 

它給出了我遇到的編譯錯誤。不知道爲什麼重載不工作,而不同的方法......

+2

你更新的代碼編譯爲我。請不要發佈你沒有打擾測試的代碼! – interjay 2012-01-03 12:08:34

+0

對不起。我認爲我已經在一個適當的簡化例子中代表了我的真正問題。事實上,這個例子確實可以編譯。這是區別:在我的實際代碼中,purefunc和concretefunc都具有相同的名稱func。爲什麼它不適用於重載的方法? (和我怎麼能適當改變我的帖子? – Bartel 2012-01-03 12:34:41

+0

「_explicit型casted_」這裏沒有投,只是一個參考的結合,這並派生基於隱式轉換 – curiousguy 2017-01-26 19:06:54

回答

1
template < class T > class B : A <T> { 
//        ^^^^^^^ 

您正在使用私有繼承。添加一個public應該修復它。

template < class T > class B : public A <T> { 

(另外,你應該添加public: A內和B,這樣的方法可以是外部訪問。)

+0

感謝您指出了這一點。忘了設定的分類在我假的例子,但在我的實際代碼中,public已經存在,所以沒有解決問題(我希望我的虛擬代碼現在是正確的)。 – Bartel 2012-01-03 11:58:04