从 class 模板实现纯虚函数 - 参数类型
Implementing pure virtual functions from class template - parameter types
我想创建一个抽象 class 模板,强制所有实例使用纯虚函数实现一个 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<T>& X<T>::doStuff(X<T>&) [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&
的 return 值不会产生类似的错误消息。
也许我使用了错误的方法来实现我想要的 - 请随时告诉我。
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。
更不用说返回对局部变量的引用是未定义的行为。
通过将 Y&
设置为参数,您可以更改 doStuff
的签名,因此 res
是抽象的。
X<int>&
不是 Y&
即使 Y
继承了 X
.
我想创建一个抽象 class 模板,强制所有实例使用纯虚函数实现一个 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<T>& X<T>::doStuff(X<T>&) [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&
的 return 值不会产生类似的错误消息。
也许我使用了错误的方法来实现我想要的 - 请随时告诉我。
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。
更不用说返回对局部变量的引用是未定义的行为。
通过将 Y&
设置为参数,您可以更改 doStuff
的签名,因此 res
是抽象的。
X<int>&
不是 Y&
即使 Y
继承了 X
.