我想创建一个抽象类模板,强制所有实例使用纯虚函数实现doStuff函数。
我有以下模板:
template<class T>
class X
{
public:
X() {};
virtual ~X() {};
virtual X<T>& doStuff(X<T>& x) = 0;
};
T = int的实例:
class Y : public X<int>
{
public:
Y();
virtual ~Y();
Y& doStuff(Y& x) {
Y res;
Y& res2 = res;
return res2;
}
};
我收到错误消息:
在会员功能'Y&amp; Ÿ:: doStuff(Y&安培;)”: 不能将变量'res'声明为抽象类型'Y' 因为以下虚函数在'Y'内是纯粹的: X&安培; X :: doStuff(X&amp;)[with T = int]
如果我在Y中将参数的类型更改为doStuff,一切都很好:
class Y : public X<int>
{
public:
Y();
virtual ~Y();
Y& doStuff(X<int>& x) {
Y res;
Y& res2 = res;
return res2;
}
};
当Y实现X?
时,为什么参数不能作为Y对象的引用?Y&amp;的回报值不会创建类似的错误消息。
也许我使用错误的方法来实现我想要的东西 - 随时让我知道。
答案 0 :(得分:3)
通过将Y&
设置为参数,您可以更改doStuff
的签名,因此res
是抽象的。
X<int>&
继承Y&
, Y
也不是X
。
答案 1 :(得分:2)
当Y实现X?
时,为什么参数不能作为Y对象的引用?
因为你必须提供在基础的纯虚函数中声明的确切签名。
那是
的原因class Y : public X<int> {
// ...
X<int>& doStuff(X<int>& x) override;
};
作品。
查看工作Live Demo。
更不用说返回对局部变量的引用是未定义的行为。