2014-07-25 37 views
0

如何做一個使用繼承的時候,我們有一個模板類有模板指針一個人怎麼使用繼承的時候,我們有一個模板類有模板指針

我們知道,基類指針可以輕鬆地指向一個派生類對象。我創建了另一個模板類,並傳遞了基礎並派生出來。然而,即使有一個重載=運算符,我也不能使它相等,這是我的需要。

請看看my sample code,因爲它清楚地說明了情況。

#include <iostream> 
using namespace std; 
class base1 
{ 
    public: 
     int a; 
     virtual int reset(){ 
      a=0; 
      return a; 
     } 
}; 

class derived1: public base1 
{ 
    public: 
     int b; 
     int reset(){ 
      b=0; 
      return b; 
     } 

}; 

template <class T> 
class templateClass{ 
public: 
T *P; 

    T& operator = (templateClass &b) 
    { 
     this.p = reinterpret_cast<T>(b.p); 
     return *this; 
    } 

    void resetMyself(){ 
     P->reset(); 
    } 
}; 

int main() { 
    // your code goes here 
    templateClass<base1> *p = new templateClass<base1>() ; 
    templateClass<derived1> *q = new templateClass<derived1>() ; 
    p=q; 

    p->resetMyself(); 

    return 0; 
} 

當我編譯我的代碼,我得到

prog.cpp: In function ‘int main()’: 
prog.cpp:44:3: error: cannot convert ‘templateClass<derived1>*’ to ‘templateClass<base1>*’ in assignment 
    p=q; 
^
+0

您不能將類型爲'templateClass '的指針指定爲'templateClass '類型的指針。但是,您可以使用模板化函數(不是模板化(純粹)虛擬函數),並避免使用模板化的基類。不知道你的情況是否可行。 – druckermanly

+2

啊,這是CRTP。更直接的解釋是你不能使用爲靜態多態(CRTP)設計的東西,然後獲得動態多態的相關好處(繼承)。如果我錯了,有人可以糾正我,但我相信在第一種情況下,類型是在編譯時確定的。第二次,類型是在運行時確定的。所以這兩者(在很多情況下)是不兼容的。 – druckermanly

回答

1

templateClass<derived1>templateClass<base1>是爲intdouble不同。您不能將指向一個的指針指向另一個指針。

可以,但是,請templateClass<derived1>分配給templateClass<base1>使用自定義模板賦值運算符:

template <class T> 
class templateClass{ 
public: 
    T *P; 

    template <class U> 
    templateClass& operator = (const templateClass<U> &b) 
    { 
     P = b.P; 
     return *this; 
    } 

    void resetMyself(){ 
     P->reset(); 
    } 
}; 

然後,你可以這樣做(demo):

templateClass<base1> p; 
templateClass<derived1> q; 
p = q; 

請注意,您的初始分配操作員的簽名不正確。此外,reinterpret_cast是一個可怕的想法。要執行指針到基址的指針到派生的轉換,請使用static_cast。上述版本不使用強制轉換,因此只允許隱式轉換(即從derivedbase,但不能反過來)。