
C++的特性是封装 继承 抽象 多态 本章重点介绍下多态
多态可以分为重载和覆盖
1 重载
C++ 重载:重载是函数名相同,但是形参的个数和形参的数据类型以及函数的返回值不一定相同。这叫做重载。
指在同一范围定义中的同名成员函数才存在重载关系
重载不允许只是依靠返回值不同去区分。
我们可以在一个类中重载一个函数
如图,我们重载add函数,输入不同的参数个数和参数类型包括返回值
2 重写(覆盖 override)
子类重写(覆盖)父类函数:子类继承了父类的函数,这个时候我们希望重写父类函数,首先有几个要点需要注意:重写指的是在派生类中覆盖基类中的同名函数,重写就是重写函数体,要求基类函数必须是虚函数且
1 子类只能够重写基类的虚函数,不是虚函数的会直接覆盖
2 与基类的虚函数有相同的参数个数
3 与基类的虚函数有相同的参数类型
4 与基类的虚函数有相同的返回值类型错误示范:add在父类不是虚函数
正确示范:使用父类的虚函数来重写
override关键字表示,此函数是重写父类的成员函数。
我们发现,继承父类的函数会父类的所有成员函数,可以重写父类的虚函数。ovverride关键字是c++编译器提供的检测机制,表示该函数是从基函数中重写。finnal关键字表示这个函数或者这个类是最后一个,不允许子类重写函数或者不允许继承这个父类。
小结:
重载与重写的区别:
1 重写是父类和子类之间的垂直关系,重载是不同函数之间的水平关系
2 重写要求参数列表相同,重载则要求参数列表不同,返回值不要求
3 重写关系中,调用方法根据对象类型决定,重载根据调用时实参表与形参表的对应关系来选择函数体
基类指针指向派生类对象时,基类指针可以直接调用到派生类的覆盖函数
也可以通过 :: 调用到基类被覆盖的虚函数;
基类指针只能调用基类的被隐藏函数,无法识别派生类的隐藏函数。
隐藏函数是:子类继承的时候,对基类的成员函数(非虚函数)使用相同的函数名,但是函数参数个数和类型不同,那么称基类的函数为被隐藏函数
> int main() {
A *p = new B();
p->fun(1); // 调用子类 fun 覆盖函数
p->A::fun(1); // 调用父类 fun
p->add(1, 2);
// p->add(1); // 错误,识别的是 A 类中的 add 函数,参数不匹配
// p->B::add(1); // 错误,无法识别子类 add 函数
return 0;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)