函数覆盖或超载
问题描述:
class A
{
public:
int func1()
{
cout<<"A's func1";
}
}
class B:public A
{
public:
int func1()
{
cout<<"B's func1";
}
}
在上面的代码片段中,是函数'func1()'在类B中重载吗?函数覆盖或超载
或越来越被B类覆盖..?
答
覆盖只能在基类成员函数声明为虚拟时发生。仅当两个函数具有不同的签名时才会发生重载。
这些条件都不适用于此。在这种情况下,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::func1
到B
定义,从而超载A::func1()
和B::func1(int i)
:
class B: public A
{
public:
using A::func1;
int func1(int i)
{
cout << "B's func1(" << i << ")\n";
}
};
另外,不要在每个类定义的末尾忘记所需的分号。
答
如果你取得了在课堂上func1
一个虚拟那么B类将被重写func1
,因为它不是虚拟的,你都躲在A.
答
在继承基类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级
我会建议不使用大写锁定您的问题或答案。这提高了大多数其他用户的可读性。如果其他格式化选项不可用,我只能使用大写字母锁定强调单词。 – Alex 2012-03-15 18:13:33