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;
^
您不能將類型爲'templateClass'的指針指定爲'templateClass '類型的指針。但是,您可以使用模板化函數(不是模板化(純粹)虛擬函數),並避免使用模板化的基類。不知道你的情況是否可行。 –
druckermanly
啊,這是CRTP。更直接的解釋是你不能使用爲靜態多態(CRTP)設計的東西,然後獲得動態多態的相關好處(繼承)。如果我錯了,有人可以糾正我,但我相信在第一種情況下,類型是在編譯時確定的。第二次,類型是在運行時確定的。所以這兩者(在很多情況下)是不兼容的。 – druckermanly