c – 从类模板实现纯虚函数 – 参数类型
作者:互联网
我想创建一个抽象类模板,强制所有实例使用纯虚函数实现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;
}
};
我收到错误消息:
In member function ‘Y& Y::doStuff(Y&)’:
cannot declare variable ‘res’ to be of abstract type ‘Y’
because the following virtual functions are pure within ‘Y’:
X& X::doStuff(X&) [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&的回报值不会创建类似的错误消息.
也许我使用错误的方法来实现我想要的东西 – 随时让我知道.
解决方法:
Why can the parameter not be a reference to a Y object when Y implements X?
因为您必须提供在基本的纯虚函数中声明的确切签名.
这就是为什么
class Y : public X<int> {
// ...
X<int>& doStuff(X<int>& x) override;
};
作品.
见工作Live Demo.
更不用说返回对局部变量的引用是未定义的行为.
标签:c,templates,types,covariance,virtual-functions 来源: https://codeday.me/bug/20190828/1753752.html