当我们有一个模板类时,如何使用继承具有模板指针
我们知道基类指针可以很容易地指向派生类对象。我创建了另一个模板类并传递了base并派生了它。然而,即使有一个超载=运算符,我不能使等于我的需要。
请仔细阅读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 :(得分:1)
templateClass<derived1>
和templateClass<base1>
与int
和double
不同。您不能将指针指向一个指向另一个的指针。
但是,您可以使用自定义模板化赋值运算符将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
。上面的版本不使用强制转换,因此只允许隐式转换(即从derived
到base
,但不能反过来。)