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

探讨下c++中的多态

2016-03-26 21:10 274 查看
    面向对象编程的意义就是:继承、封装、多态,这三个特征就是为了实现代码重建,为编程提供方便,多态是面向对象编程中一个很重要的应用,它的本质就在于接口重建,在此,像大家简单的介绍下在C++语言下的多态的实现和意义。说到多态,相信大家基本都会脱口而出,不就是重载和覆盖么,那么我想问什么是重载什么是覆盖(重写)?好的,下面先来一段百度:重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。

    重载函数常用来实现功能类似而所处理的数据类型不同的问题。注意,这一段话有几个重点,1、重载只看形参,如果函数的名字相同,形参也一样,但是返回值不同,那就不算是重载,形参的不同包括几种形式,形参数量不同、顺序不同、数据类型不同,那么下面这种情况算不算函数的重载?

int getValue(int a)
{
return a;
}
double getValue(double a)
{
return a;
}


     很明显是重载啊,参数类型不同,跟返回值没有关系。但是在函数重载的时候要尽量避免二义性的问题,举个例子:

void Value(int a);
void Value(double a);

     这个在传参数的容易引起二义性,所以不推荐这么使用。

讲完了函数的重载,那么下面我们来讲讲重写(overwrite),说到重写,就不得不提到虚函数这个函数,虚函数在java等语言中被叫做抽象函数被认为是接口函数,不管怎怎么叫,他的意义是一样的,就是为了实现接口继承。首先我们先介绍下虚函数,其实就是virtual关键字+函数名,为了实现接口和实现的分离,用基类的指针调用派生类的函数来实现多态的一种方法,好了,举个例子:

class father
{
public:
void func()
{
cout<<"this is func 1"<<endl;
}
};
class child:public father
{
public:
void func()
{
cout<<"this is func 2"<<endl;
}
};
int main(int argc, const char * argv[])
{
father a;
child b;
father *p=&a;
p->func();
p=&b;
p->func();
return 0;
}
输出的结果是this is func 1和this is func 1.如果将基类father中的函数func()编程virtual函数的话,输出就变成了this is func 1和this is func 2.也就是通过重写虚函数实现了多态。因为基类的指针在调用虚函数时,会在虚函数列表中寻找函数的地址,从而调用到子类中的函数,实现了多态。

以上均为个人观点,不足之处还望批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息