ima*_*agi 4 c++ inheritance visual-studio-2010 visual-c++
我正在尝试在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);
}
Run Code Online (Sandbox Code Playgroud)
我的理解是Derived将有两种方法:
std::wstring GetString(unsigned id) const
std::wstring GetString(const std::wstring& id) const
Run Code Online (Sandbox Code Playgroud)
所以我的代码应该成功编译.但是,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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?当我以这种方式使用时,代码可以正常工作:
Derived d;
Base base = d;
base.GetString(1);
Run Code Online (Sandbox Code Playgroud)
或者当GetString的两个变体都在同一个类中定义时.
有任何想法吗?我想避免明确的类型转换.
Oli*_*rth 11
Derived::GetString隐藏Base::GetString.* 要解决此问题,请执行以下操作:
class Derived : public Base
{
public:
using Base::GetString;
std::wstring GetString(const std::wstring& id) const
{
return L"derived";
}
};
Run Code Online (Sandbox Code Playgroud)
另见 http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9.