c ++继承 - 具有不同参数类型的相同方法名称

时间:2011-12-14 21:44:26

标签: c++ visual-studio-2010 visual-c++ inheritance

我正在尝试在VC ++ 2010中编译以下代码:

class Base
{
public:
    std::wstring GetString(unsigned id) const
    {
        return L"base";
    }
};

class Derived : public Base
{
public:
    std::wstring GetString(const std::wstring& id) const
    {
        return L"derived";
    }
};

int wmain(int argc, wchar_t* argv[])
{
    Derived d;

    d.GetString(1);
}

我的理解是Derived将有两种方法:

std::wstring GetString(unsigned id) const
std::wstring GetString(const std::wstring& id) const

所以我的代码应该成功编译。但是,Visual C ++ 2010会报告以下错误:

test.cpp(32): error C2664: 'Derived::GetString' : cannot convert parameter 1 from 'int' to 'const std::wstring &'
      Reason: cannot convert from 'int' to 'const std::wstring'
      No constructor could take the source type, or constructor overload resolution was ambiguous

我做错了什么?当我以这种方式使用时,代码可以正常工作:

Derived d;
Base base = d;
base.GetString(1);

或当GetString的两个变体都在同一个类中定义时。

有什么想法吗?我想避免明确的类型转换。

1 个答案:

答案 0 :(得分:11)

Derived::GetString隐藏Base::GetString * 要解决此问题,请执行以下操作:

class Derived : public Base
{
public:
    using Base::GetString;

    std::wstring GetString(const std::wstring& id) const
    {
        return L"derived";
    }
};

<小时/> *出于相当模糊的原因,Scott Meyers在“Effective C ++”的第50章中解释过。

另见http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9