0

好的,我有一个包含所有 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
        };
};

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

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

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

4

1 回答 1

2

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

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

于 2013-05-25T02:15:57.440 回答