重载基类功能

时间:2013-05-25 02:09:31

标签: c++ c++11

好的我有一个包装所有WinAPI控件的类,使它们像Java / C#/ .Net控件一样运行(是的,我知道有些库已经这样做了),看起来像是:

class Control
{
    public:
          //Bunch of other stuff..

        virtual HWND GetHandle() const;
};

和派生类看起来像:

class MenuBar: public Control
{
    public:
        //Bunch of other stuff..

        virtual HMENU GetHandle() const;


        enum class Flags
        {
            POPUP = MF_POPUP, STRING = MF_STRING
        };
};

但是,编译器给出了一个关于重载Base Class'GetHandle函数的错误返回类型的错误。

如何重载GetHandle以使其具有不同的返回类型并使其忽略Base类的实现?我非常喜欢这个名字GetHandle()并且不想改变它(虽然这是一个选项)..

还有其他方法吗?我问,因为也许有办法让它忘记基类有一个实现?

1 个答案:

答案 0 :(得分:2)

您需要协变返回类型。派生类的返回类型需要是从基类的返回类型派生的指针或引用。

这可以通过将HWNDHMENU包装在与API组织并行的类层次结构中来实现。如果模板全部通用,模板可能会有所帮助。