在从基础模板化类派生的类中,我重写方法createType()
。当我尝试访问派生类的createType(int)
时,编译器说它不存在。为什么呢?
template <class T>
class BaseClass
{
public:
virtual T createType(){ return T(); }
virtual T createType(int){ return T(); }
};
class Point
{
public:
float x, y;
};
class PointFactory : public BaseClass<Point>
{
public:
virtual Point createType() { return BaseClass::createType(); }
};
int main()
{
PointFactory pf;
auto p = pf.createType(5); // error here
return 0;
}
我得到的错误是
错误C2660:'PointFactory :: createType':函数不带1个参数
答案 0 :(得分:7)
virtual Point PointFactory::createType()
隐藏了基本重载。
您可以添加using BaseClass<Point>::createType;
来修复:
class PointFactory : public BaseClass<Point>
{
public:
using BaseClass<Point>::createType; // unhide overloads
Point createType() override { return BaseClass::createType(); }
};
答案 1 :(得分:0)
除了覆盖之外,还有另外两个问题:
使用参数调用子类函数,但子类没有带有该参数的成员函数。
return T;
?如果是T
,例如int
然后就是return int;
,您希望它如何运作?这将导致基类中的函数不存在,并且在您override
函数后,可能会给出类似的错误。
答案 2 :(得分:0)
检查g ++报告的错误可能更清楚:
g++ -std=c++11 -g -Wall -Wextra -Wwrite-strings -c -o 36315450.o 36315450.cpp 36315450.cpp: In function ‘int main()’: 36315450.cpp:24:29: error: no matching function for call to ‘PointFactory::createType(int)’ auto p = pf.createType(5); // error here ^ 36315450.cpp:24:29: note: candidate is: 36315450.cpp:18:19: note: virtual Point PointFactory::createType() virtual Point createType() { return BaseClass::createType(); } ^ 36315450.cpp:18:19: note: candidate expects 0 arguments, 1 provided make: *** [36315450.o] Error 1
因为您覆盖createType()
,所以createType(int)
会被遮蔽。除非您在派生类中重新实现它,否则它将无法访问,可能使用using
:
class PointFactory : public BaseClass<Point>
{
public:
virtual Point createType() { return Point(0,0); }
using BaseClass<Point>::createType;
};
我已经使覆盖createType()
做了除了传递给基类之外的其他事情,否则这将是多余的!