class A
{
public:
int func1()
{
cout<<"A's func1";
}
}
class B:public A
{
public:
int func1()
{
cout<<"B's func1";
}
}
在上面的代码片段中,函数'func1()'是否在B类中重载?
或被B级压倒..?
答案 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::func1
和B
,从而:
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级的你好