问一下覆盖和隐藏的区别解决办法
小弟初学C++,看到覆盖和隐藏的概念,不过有点不太懂。网上大家有总结。
覆盖:父类成员和子类成员名称类型一样,而且父类的成员有virtual关键字。
隐藏:在没有virtual的情况下,只要名字一样就会隐藏。
有virtual的情况下,除了覆盖的情况就是隐藏。
不过,我实在不明白,这只是名字的不一样。在实际编程的时候,覆盖和隐藏有什么区别吗?
------解决方案--------------------
不懂,待高人出现
------解决方案--------------------
要理解overide, overload, inherence的区别
inherence就是继承,OO里的基本概念。
overide是指派生类中有一个和基类同名的函数(只要同名就算),我们就称“类B override了类A的fun()成员函数”。overide只能用于虚函数的重写。对于非虚拟函数进行 override 的后果叫做“覆盖”。
overload是指在同一个namespace中,有多个同名但不同参数的函数。不同的类之间不存在overload关系。
因此,override和overload是截然不同的:override发生于派生类与基类之间,而overload只发生于一个类或者namespace的范围之内。
---------------------------
先说override吧,看下面的例子:
type
TFigure = class
procedure Draw; virtual;
end;
TRectangle = class(TFigure)
procedure Draw; override;
end;
TEllipse = class(TFigure)
procedure Draw; override;
end;
你看到了吧,最原始的父类TFigure有一个draw方法,然后继承这个类的TRectangle也有一个Draw方法,这个方法与父类的Draw同名,所以就等于重载了父类方法,但这样的重载要求父类的方法是virtual的。
再说overload:
type
T1 = class(TObject)
procedure Test(I: Integer); overload; virtual;
end;
T2 = class(T1)
procedure Test(S: string); reintroduce; overload;
end;
看上面的例子,T1有一个Test方法,T2也有一个叫Test的方法,但两个方法名称相同,只是参数不一样,这样为了就需要overload声明,用来证明这个叫Test方法可能有多种不同的调用,编译时是根据参数类型做判断的。
------解决方案--------------------
等你以后代码写多了,自然会理解。实践出真知。没必要现在就必须搞清楚。
------解决方案--------------------
class A
{
public:
void show(int a)
{
printf( "class a show\n " );
}
};
class B:public A
{
void show()//如果这里没有show(),则基类的void show(int a)在派生类的对象上是可调用的,但因为派生类也定义了show(),则会隐藏基类的show(),若不使用额外的方法,A::show()在B的对象上不可调用.
{
printf( "class b show\n " );
}
};
void main()
{
B b;
b.show();
}
------解决方案--------------------
楼主的术语不太标准,用英文的,如下。
override(一般翻译为“重写”):子类重新定义父类的virtual函数;
hide(一般翻译为“隐藏”):子类的成员函数定义隐藏了父类的同名函数(一般情况下,此函数是non virtual,如果是virtual,则子类同名函数的签名与父类不同);或者是内部域的同名实体隐藏了外部域的同名实体;
overload(一般翻译为”重载“):就是同名但签名不同的一组函数集合;
基本就是这些了。
------解决方案--------------------
你看一下这个就明白了:
#include <iostream>
#include <cstdlib>
using namespace std;
class A
{
public:
virtual void dispaly()
{
cout < < "show A " < <endl;
}
};
class B:public A
{
public:
void dispaly()
{
cout < < "show B " < <endl;
}
};
int main()
{
A a;
a.dispaly();
B b;
b.dispaly();
A * aa=new A();
aa-> dispaly();
aa= new B();
aa-> dispaly();//如果不是虚函数(virtual void dispaly())则输出的结果为show A
return 0;
}
结果是:
show A
show B
show A
show B//主要的问题就在这(多态的概念)