gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:46:12 25 4
gpt4 key购买 nike

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

我们知道基类指针很容易指向派生类对象。我创建了另一个模板类并在其中传递了 base 和 derived 。但是,即使使用重载的 = 运算符,我也无法使 then 相等,这正是我的需要。

请看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<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;

请注意,您原来的赋值运算符(operator)的签名不正确。另外,reinterpret_cast这是一个糟糕的主意。要执行从指针到派生指针的转换,请使用 static_cast .上述版本不使用强制转换,因此仅允许隐式转换(即从 derivedbase,但不能反过来)。

关于c++ - 当我们有一个模板类有模板指针时,如何使用继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24950399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com