2012-01-14 74 views
3

有兩種類A和B,其中A是基類和B是派生類:C++,多態性與函數參數的模板化

template <typename T> 
class A {T a;}; 

template <typename T> 
class B: public A <T> {T b;}; 

和表示改性容器

以下類
template <typename Item> 
struct TItems {typedef std::vector <Item> Type;}; 

template <typename Item> 
class ModCont 
{ 
    private: 
      typename TItems <Item>::Type items; 
}; 

功能測試()具有指向一個對象作爲形式參數的容器:

template <typename T> 
void test (ModCont <A <T> > *it) {} 

我想申請多態性與通過B的容器的方法測試:

int main(int argc, char* argv[]) 
{ 

    ModCont < A <double> > a_items; 
    ModCont < B <double> > b_items; 
    test (&a_items); //Works 
    test (&b_items); //Does not work 
    return 0; 
} 

我發現的唯一的方法是模板化以這種方式的測試()方法的參數:

template <typename Object> 
void test (ModCont <Object> *it) {} 

有什麼辦法如何使用「功能」的多態性,而不是編譯多態性(模板?)

感謝您的幫助......

+0

你很困惑:(1)模板是多態的一種形式(2)模板在編譯時是專用的,不是運行時。 – Marcin 2012-01-14 10:08:18

+0

@Marcin:感謝您的評論... – justik 2012-01-14 10:11:17

+2

您的函數'test',如給出的,不是一個方法,而是一個自由函數。請顯示最小的可編譯代碼來顯示問題,所以我們不必猜測您真正做了什麼。 – celtschk 2012-01-14 10:13:38

回答

3

Uhm,首先,模板是而不是運行時多態 - 它們是編譯時多態。

如果你想使用運行時多態性,你必須確保ModCont<B<T> >派生自ModCont<A<T> > - C++處理多態的方式不會使它成爲默認值。或者,你可以讓所有的ModCont<T>來自一些通用的ModContBase,儘管目前還不清楚這是如何工作的。

+0

只是爲了說明:你沒有向我們展示過ModCont是以任何其他方式運行的多態的,所以我認爲模板是無論如何要走的路(和通過引用一起)。 – 2012-01-14 10:16:01

+0

比我寫的更快。當然,它不是一個運行時多態 – justik 2012-01-14 10:16:11

3

蘋果是FRU它。

一袋蘋果不是一袋水果。那是因爲你可以把梨放在一袋水果中。

0

您希望您的容器是A *而不是A您還希望有一個構造函數,它接受U *的容器並將該容器的內容添加到其自身。使用static_cast作爲這個類型,這樣你就有了類型安全性,即U是從A派生出來的類型。