我有一個抽象基類的純和混凝土虛擬方法的混合,例如混凝土虛擬方法: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) { ... }
它給出了我遇到的編譯錯誤。不知道爲什麼重載不工作,而不同的方法......
你更新的代碼編譯爲我。請不要發佈你沒有打擾測試的代碼! – interjay 2012-01-03 12:08:34
對不起。我認爲我已經在一個適當的簡化例子中代表了我的真正問題。事實上,這個例子確實可以編譯。這是區別:在我的實際代碼中,purefunc和concretefunc都具有相同的名稱func。爲什麼它不適用於重載的方法? (和我怎麼能適當改變我的帖子? – Bartel 2012-01-03 12:34:41
「_explicit型casted_」這裏沒有投,只是一個參考的結合,這並派生基於隱式轉換 – curiousguy 2017-01-26 19:06:54