您的位置:首页 > 编程语言 > C语言/C++

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

2014-07-30 11:16 288 查看
一、几个概念

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

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

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

二、一些理解

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

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

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

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

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

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

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

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

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

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

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

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

三、纯虚函数

引入原因

1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。

2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: