class A
{
public:
int func1()
{
cout<<"A's func1";
}
}
class B:public A
{
public:
int func1()
{
cout<<"B's func1";
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,函数'func1()'在B类中被重载了吗?
或被B级压倒..?
Mar*_*tos 13
覆盖只能在基类成员函数声明为virtual时发生.只有当两个函数具有不同的签名时才会发生重载.
这些条件都不适用于此.在这种情况下,B::func1只是隐藏A::func1.
附注:我指出的超载条件是必要的,但在这种情况下还不够.即使你声明B::func1(int i)了签名是不同的,因为C++的名字查找规则B::func1仍然会隐藏A::func1.
血腥的细节:当你写作时b->func1(),C++ func1首先在范围内寻找名字B; 由于B在其范围内具有该名称,编译器会在那里结束其搜索,然后,即使b->func1()最终无法匹配签名,也不会再进一步查看B::func1(int i).你可以改变这种行为,并且过载A::func1()和B::func1(int i)加入using A::func1到的定义B,即:
class B: public A
{
public:
using A::func1;
int func1(int i)
{
cout << "B's func1(" << i << ")\n";
}
};
Run Code Online (Sandbox Code Playgroud)
另外,不要忘记每个类定义末尾所需的分号.