2010-10-17 89 views
3
class A 
{ 
    public: 
      int func1() 
      { 
       cout<<"A's func1"; 
      } 
} 

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

在上面的代码片段中,是函数'func1()'在类B中重载吗?函数覆盖或超载

或越来越被B类覆盖..?

回答

13

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

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

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

血淋淋的细节:当您编写b->func1()时,C++在B的范围内首先查找名称func1;由于B在其范围内具有该名称,因此编译器在此处结束搜索,然后再查看,即使b->func1()最终无法与签名B::func1(int i)匹配。你可以改变这种行为,并通过添加using A::func1B定义,从而超载A::func1()B::func1(int i)

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

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

3

如果你取得了在课堂上func1一个虚拟那么B类将被重写func1,因为它不是虚拟的,你都躲在A.

-1

在继承基类func1实现中,如果(对容易理解的公开说明符)公共说明符在基类中具有成员函数,如果我们通过使用基类的对象而不是基类 的成员函数通过主要的 函数调用基类,而不是父类成员函数意味着函数被覆盖。

(前提是成员函数的名称应该相同)。

#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级

+1

我会建议不使用大写锁定您的问题或答案。这提高了大多数其他用户的可读性。如果其他格式化选项不可用,我只能使用大写字母锁定强调单词。 – Alex 2012-03-15 18:13:33