C++中的多态——重载和虚函数

多态

多态:字面理解是“多种状态”,表示“一个接口,多种方法”。实现代码接口重用,无论传过来的是哪个类的对象,都可以通过多态,实现调用对应类的代码。
静态多态:编译时确定多态:重载和隐藏都属于静态多态,因为都是在编译的阶段确定需要执行的函数;
动态多态:运行时确定多态(真正的多态),覆盖相当于动态多态,只有在运行时才能确定要执行的函数。

同名函数的关系:overload、override、hide

overload

构成overload的条件:
同一个域中(如:在一个类中);
函数名相同但参数不同;

override(虚函数)

override:基类对象的指针或引用(不能是基类对象)访问虚函数时,根据指针或引用的实际对象决定调用实际对象对应的函数,也就是说:派生类中的虚函数覆盖了基类中同名且参数相同的函数,也就是多态的概念,是动态绑定的,也有种说法是动态多态。

构成override的条件:
带有“virtual”关键字;
函数名和参数都相同;
分别在基类和派生类中。

hide

hide:从字面意思上理解就是某一个函数把其他同名的函数藏起来了,不让编译器找到其他函数,只把自己暴露到外面。调用类的成员函数的步骤:编译器依据调用的函数名,顺着继承链逐级向上查找函数的定义,直到找到为止,如果派生类和其基类中都定义了同名的函数(跟函数的参数没关系,因为查找仅仅是根据函数名进行查找),那么编译器将选择派生类中的函数,也就是说派生类中的函数把基类的同名函数hide了,阻止编译器向上查找。

构成隐藏的条件:
同名;
位于基类和派生类中;
若参数不同:一定是hide;
若参数相同:是否有virtual关键字,如果有:override;否则:hide;

override和hide的例子

class Base
{
public :
virtual void f( float x) {cout << " Base::f(folat) " << x << endl;} 
void g( float x) {cout << " Base::g(float) " << x << endl;} 
} ;

class Derived: public Base
{
public :
virtual void f( float x) {cout << " Derived::f(float) " << x << endl;} 
void g( int x) {cout << " Deriver::g(int) " << x << endl;} 
} ;

int main()
{
Derived d;
Base * pb =& d;
Derived * pd =& d;
pb -> f( 3.14f ); // 输出结果: Derived::f(float)(override)
pd -> f( 3.14f ); // 输出结果: Derived::f(float)(override)
pb -> g( 3.14f ); // 输出结果:Base::g(float)3.14 (pb是基类,从基类往上搜索,先找到基类中的函数)
pd -> g( 3.14f ); // 输出结果:Dervied::g(int)3 (pb是基类,从基类往上搜索,先找到派生类类中的函数)
return 0 ;
} 

虚函数和纯虚函数

虚函数可以直接在基类中实现,纯虚函数不能在基类中实现,必须在每个派生类中定义,包含纯虚函数的类是抽象类,该类不能实例化。

参考链接

  1. C++三大特性之多态
  2. C++重载覆盖和隐藏,虚函数与纯虚函数
  3. C++ 虚函数 重载 重写的区别(转)
  4. C++——虚函数,纯虚函数,函数重载
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值