当模板类具有模板指针时,如何使用继承

时间:2014-07-25 07:35:07

标签: c++ templates inheritance

当我们有一个模板类时,如何使用继承具有模板指针

我们知道基类指针可以很容易地指向派生类对象。我创建了另一个模板类并传递了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;
   ^

1 个答案:

答案 0 :(得分: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,但不能反过来。)