一,函数重载(overload)的定义:
函数重载是指具有相似功能的不同函数使用同一函数名,但这些同名函数的参数类型、参数个数、返回值、函数功能可以不同。编译系统将根据函数参数的类型和个数来判断使用哪一个函数。体现了C++对多态性的支持。
【注意】1.【参数表】同名不同参数,函数的重载不以返回值作为区分函数重载的类型,通常情况下的重载,首先函数名一定要相同,其次参数的类型,个数,顺序至少有一个必须有所区别(函数的参数不能完全相同)。
2.【作用域】必须在一个域中,名称相同但参数必须要有差异,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数无法构成重载,这是重载的重要特征。
二,隐藏的定义:
隐藏就是我们通常所说的重写基类,指的是派生类的成员函数隐藏了基类的成员函数。
对隐藏的理解:
在调用一个类的成员函数的时候,编译器会沿着当前类的继承链逐级的向上查找函数的定义,如果找到了那么就停止查找了,基类和派生类都有一个同名同参数的函数,下面我们分别用两种方式(类对象和类指针)调用成员函数来验证这一说法:
B类继承A类,且他们有一个同名同参数的函数show(),A的show()输出“print A”,B的show()输出“print B”
A a, *apt;
B b, *bpt;
类对象:
类对象a和b分别调用a.show()和b.show()
a属于A类型,所以他先会在类A中找show()函数并输出“print A”,
b属于B类型,所以他先会在类B中找show()函数并输出“print B”,
类指针:
(1)类指针apt=&a, 此时apt属于A类型,所以apt->show()先会在A类中去寻找show函数的定义,并输出“print A”
(2)类指针apt=&b, 此时apt还是属于A类型,所以apt->show()先会在A类中去寻找show函数的定义,
并输出“print A”
(3)类指针bpt=&b,
此时bpt属于B类型,所以apt->show()先会在B类中去寻找show函数的定义,
并输出“print B”
|
【注意】1. 【参数表】一定是同名(同或不同)参数(name hide规则)。
2.【作用域】发生在基类和派生类中。
3.派生类会把所有基类里面的同名函数都给隐藏掉(不管参数是否相同),称为
name hide规则
class A
{
public:
void show(int){ cout << "this is class A" << endl; }
void show(int, int){ cout << "this is class A TWO" << endl; }
};
class B:public A
{
public:
void show(int){ cout << "this is class B" << endl; }
};
void main()
{
A a, *apt;
B b, *bpt;
apt = &b;
apt->show(4);//this is class A
apt->show(4, 7);
bpt = &b;
bpt->show(4);//this is class B//
隐藏基类
bpt->show(4, 7);
//会报错,派生类B中的show把基类A中的两个show都隐藏掉了,名字隐藏规则,只看名字,不看参数
system("pause");
}
|
三,覆盖的定义:
覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支持的特性,所谓的覆盖指的是用基类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数,因此此时派生类的成员函数可以"覆盖"掉基类的成员函数.
【注意】1.
【参数表】同名同参数,不然,就是派生类中定义的一个普通函数,会把基类里面的同名函数全给隐藏掉
2.【作用域】
发生在基类和派生类中
覆盖与重写可以说是一样的,但与重载不同。
override(重写)是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就属于override。使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(也许是一系列函数,如果该函数在基类中有重载的话,呵呵)将被隐藏,可以通过域解析操作符来调用。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是override了。
overload(重载)则是指在相同作用域中,多个函数具有相同的名字,但参数的数目和类型各不相同(当然相同数目和类型,如果顺序不同也是可以的),因为函数重载的机制是在C++中函数的签名与其参数有关,而不像C中,只与函数名有关。总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同,呵呵。
函数的重载(overload)覆盖(override)隐藏
派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有VIRRUAL关键字.些时基类的函数将被隐藏,而不是覆盖.
派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有VIRRUAL关键字,基类的函数都将被隐藏.注意这种情况与重载的区别,重载发生在同一个类中。
override(重写)是指在不同作用域中,多个函数原型完全一样,而实现却不同的函数。在C++中,经常发生在类的继承中。当基类中的某个方法是virtual或pure virtual函数时(当然访问权限必须是public或protected,因为从C++设计思想上来讲private的函数不会是virtual的,呵呵),其子类中对该方法的重新实现就属于override。使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(也许是一系列函数,如果该函数在基类中有重载的话,呵呵)将被隐藏,可以通过域解析操作符来调用。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是override了。
overload(重载)则是指在相同作用域中,多个函数具有相同的名字,但参数的数目和类型各不相同(当然相同数目和类型,如果顺序不同也是可以的),因为函数重载的机制是在C++中函数的签名与其参数有关,而不像C中,只与函数名有关。总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同,呵呵。
函数的重载(overload)覆盖(override)隐藏
派生类的函数与基类的函数完全相同(函数名和参数列表都相同),只是基类的函数没有VIRRUAL关键字.些时基类的函数将被隐藏,而不是覆盖.
派生类的函数与基类的函数同名,但参数列表不同,在这种情况下,不管基类的函数声明是否有VIRRUAL关键字,基类的函数都将被隐藏.注意这种情况与重载的区别,重载发生在同一个类中。
a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。