2011-12-14 49 views
4

我试图编译在VC下面的代码++ 2010:C++继承 - 用不同的参数类型相同的方法名

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); 
} 

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

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被定义在同一个类中时。

任何想法?我想避免显式类型化。

回答

10

Derived::GetString皮革Base::GetString*为了解决这个问题,请执行下列操作:

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

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


*对于斯科特迈尔斯解释了 “有效的C++” 的第50章相当模糊的原因。

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

+1

+1此外,您可以手动选择方法:`d.base :: GetString(1)`,但是这具有禁用动态分派的令人讨厌的副作用(如果成员函数是`virtual`,而不是案例) – 2011-12-14 21:53:20

相关问题