从模板化基类重写方法时出现的问题

时间:2016-03-30 17:13:05

标签: c++

在从基础模板化类派生的类中,我重写方法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个参数

3 个答案:

答案 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)

除了覆盖之外,还有另外两个问题:

  1. 使用参数调用子类函数,但子类没有带有该参数的成员函数。

  2. 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()做了除了传递给基类之外的其他事情,否则这将是多余的!