c++中的重载、覆盖、多态的理解

一、几个概念

1、子类重新定义父类的做法称为覆盖(override),或者称为重写。

2、C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数。

3、重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数的不同列表,将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载问题。


二、一些理解


多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数

的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需

要在运行时才确定,这就属于晚绑定。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调

用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态

性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因

为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,将始终调用基类的函数地址。

意思就是说,没有虚函数机制的C++语言,基类指针指向派生类对象时,调用的方法只能是基类的方法,这是

C++语言本身的一个限制。C++为了解决这个问题,引入了虚函数机制,实现多态。在编译代码时,如果发现调用的

方法是virtual指定的方法,则先不绑定调用地址(晚绑定),在程序执行时,才去根据虚函数表调用。其实如果其他人设计

一种语言,即使是这种情形,也是可以编译时绑定的,因为基类指针指向的实际对象的类型是确定的,在编译时需要花

费一些时间去解析,然后绑定实际的地址;或者仍然采用晚绑定,可以叫其他的什么机制,只是C++采用的就叫虚函数。

C++中的多态有两种形式:编译时多态性(通过重载函数实现)和运行时多态性(通过虚函数实现)。



三、纯虚函数

   引入原因
   1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 
   2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值