以下代码有什么问题?
class B
{
public:
int test()
{
cout<<"B:test()"<<endl;
return 0;
}
int test(int i)
{
cout<<"B test(int i)"<<endl;
return 0;
}
};
class D: public B
{
public:
int test(char x) { cout<<"D test"<<endl; return 0; }
};
int main()
{
D d;
d.test();
return 0;
}
答案 0 :(得分:4)
问题是名称隐藏。派生类test()
中的函数D
隐藏<{1}}基类test()
中的重载1},因此过载不会考虑这些重载表达式中的分辨率:
B
只需添加d.test()
声明:
using
另请注意,基类class D: public B
{
public:
using B::test;
// ^^^^^^^^^^^^^^
int test(char x) { cout<<"D test"<<endl;}
};
中的test()
重载应该返回B
,但它们不返回任何内容。
根据C ++ 11标准的第6.6.3 / 2段,在没有返回任何内容的情况下从值返回函数的末尾掉下来是未定义的行为。
答案 1 :(得分:3)
答案 2 :(得分:2)
d.test();
将无效,因为派生类test(char)
隐藏了所有基类函数,如果您执行上述操作,则不会调用匹配函数。