C++ - 函数重写或重载

Mar*_*vam 3 c++

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)

另外,不要忘记每个类定义末尾所需的分号.