наследование c ++ - то же имя метода с другим типом аргумента - PullRequest
4 голосов
/ 15 декабря 2011

Я пытаюсь скомпилировать следующий код в 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 Ответ

11 голосов
/ 15 декабря 2011

Derived::GetString скрывает Base::GetString. * Чтобы решить эту проблему, выполните следующие действия:

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

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


* По довольно неясным причинам, которые Скотт Мейерс объясняет в главе 50 «Эффективного C ++». См. Также http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...