虚函数覆盖预期的错误

时间:2012-10-13 09:17:43

标签: c++

在C ++中,我想将一个类转换为另一个类,所以我决定创建一个模板类,但是我遇到了编译错误,这里是错误,

"MyFooClass.h", line 10: error (etoa:4997):
      function "IFoo::show(OtherClass &)" is hidden by
      "MyFooClass::show" -- virtual function override
      intended?
  virtual std::auto_ptr<ClNewClass> show(ClOldClass  &oc)

这是我的代码,

//IFoo.h
class IFoo
{
    public:
        virtual ~IFoo(){}

    protected:
        virtual std::auto_ptr<OtherClass> show(OtherClass &oc) = 0;
};

//CustomFoo.h
template<typename oldClass, typename newClass>
class CustomFoo : public IFoo
{
    public:
        virtual std::auto_ptr<newClass> show(oldClass &oc)=0;

    protected:
        virtual std::auto_ptr<OtherClass> show(OtherClass &oc)
        {
            std::auto_ptr<OtherClass> result(show(static_cast<oldClass &>(oc)));
            return result;
        }
}; 

//MyFooClass.h
class MyFooClass : public CustomFoo< ClOldClass, ClNewClass >
{
    public:
        virtual std::auto_ptr<ClNewClass> show(ClOldClass &oc)
        {
            std::auto_ptr<ClNewClass> cnv(new ClNewClass(oc.params));
            return cnv;
        }
};

感谢。

1 个答案:

答案 0 :(得分:0)

show(ClOldClass&)中的函数MyFooClass与类show(OtherClass&)中的函数CustomFoo不同。新定义隐藏了另一个定义。

你是否真的想要超载而不是覆盖?如果要覆盖,则新函数需要具有与父类相同的签名。如果确实意味着重载该函数,您仍然需要其他show。向您的班级using CustomFoo::show;添加MyFooClass指令。

//MyFooClass.h
class MyFooClass : public CustomFoo< ClOldClass, ClNewClass >
{
    public:
        virtual std::auto_ptr<ClNewClass> show(ClOldClass &oc) {...}

    protected:
        using CustomFoo::show;
};