C ++ - 函数重写或重载

时间:2010-10-17 06:56:35

标签: c++

class A
{
     public:
          int func1()
          {
                cout<<"A's func1";
          }
}

class B:public A
{
     public:
          int func1()
          {
                cout<<"B's func1";
          }
}

在上面的代码片段中,函数'func1()'是否在B类中重载?

或被B级压倒..?

3 个答案:

答案 0 :(得分:13)

覆盖只能在基类成员函数声明为virtual时发生。只有当两个函数具有不同的签名时才会发生重载。

这些条件都不适用于此。在这种情况下,B::func1只是隐藏A::func1

附注:我指出过载的条件是必要的,但在这种情况下还不够。即使您声明了B::func1(int i),因此签名也不同,B::func1仍会隐藏A::func1,因为C ++的名称查找规则。

gory详细信息:当您编写b->func1()时,C ++首先在func1范围内查找名称B;由于B在其范围内具有该名称,因此编译器会在那里结束其搜索,然后,即使b->func1()最终无法与签名B::func1(int i)匹配,也不会再查看。您可以通过将A::func1()添加到B::func1(int i)的定义来更改此行为并重载using A::func1B,从而:

class B: public A
{
public:
    using A::func1;
    int func1(int i)
    {
        cout << "B's func1(" << i << ")\n";
    }
};

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

答案 1 :(得分:3)

如果您在A类虚拟中设置了func1,那么B类将覆盖func1,因为它不是虚拟的,您隐藏了func1在A。中实施。

答案 2 :(得分:-1)

在继承的基类中,if(为了便于理解公共说明符)公共说明符在基类中有成员函数,如果我们通过main调用基类 通过使一个基类的对象比输出的函数是base的成员函数 class,而不是父类成员函数,表示函数被重写。

(假设成员函数的名称应相同)。

#include<iostream.h>

class a
{
    public:
    {
        cout<<"Hello from class a";
    }
};


class b:public a
{
    public:
    void hello()
    {
        cout<<"Hello from class b";
    }
};


main()
{
    b obj;
    obj.hello();
}

输出是:

  

来自b级的你好