探讨下c++中的多态

    面向对象编程的意义就是:继承、封装、多态,这三个特征就是为了实现代码重建,为编程提供方便,多态是面向对象编程中一个很重要的应用,它的本质就在于接口重建,在此,像大家简单的介绍下在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.也就是通过重写虚函数实现了多态。因为基类的指针在调用虚函数时,会在虚函数列表中寻找函数的地址,从而调用到子类中的函数,实现了多态。

以上均为个人观点,不足之处还望批评指正。




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值