2015-02-17 103 views
0
#include<iostream> 

using namespace std; 

class C 
{ 
public: 
C(){}; 
virtual void nothing()=0; 
virtual ~C(){}; 
}; 

class A : public C 
{ 
public: 
A(){}; 
virtual void nothing(){}; 
}; 
class B:public A 
{ 
public: 
B(){}; 
void nothing(){}; 
}; 

template <class T> 
void hi(T){ 
cout << " i am something\n"; 
} 

template <> 
void hi<A>(A) 
{ 
cout << " I am A\n"; 
} 

template <> 
void hi<B>(B) 
{ 
cout << " I am B\n"; 
} 

int main () 
{ 
C *array [] = {new A,new B}; 
hi (*array [0]); 
hi (*array [1]); 

delete array [0]; 
delete array [1]; 
return 0; 

} 

日期: 我有事 我有事繼承與模板

目前我正在寫有處理
繼承類型和專門的模板程序。在上面的例子中,我想我想看到 我是A 我是B 有沒有辦法正確調用對象的函數,雖然我正在處理基類數組?我不確定通過dynamic_cast進行類型檢查和轉換是最優雅的解決方案。請注意,這只是一個較大程序的摘錄。 謝謝您提前

+1

您試圖多態使用您的對象,但模板實例化發生在編譯時。正如您所建議的,您需要運行時類型檢查。 – 2015-02-17 23:58:51

回答

1

在主程序中,下面顯示的三行創建一個C*的數組。 因此,無論 元素的實際類型是什麼,該數組中的任何元素都被視爲C*。 也就是說,當您將*array [0]傳遞給函數hi(), 時,被調用的函數是hi(C),該函數解析爲 函數,而不是專用函數中的任一個。

C *array [] = {new A,new B}; 
hi (*array [0]); 
hi (*array [1]); 

爲了使hi<A>被調用,您必須把指針 存儲到新的對象中A*類型的變量,或者你需要轉換 C*A*

在類似這樣的情況下,的C虛擬功能,在AB重寫時, 可以達到目的更好。