在c加加语言中用于实现运行时多态性的是,什么叫做多态性?在C中是如何实现多态的? 爱问知识人...

C 中的多态(虽然多态不是C 所特有的,但是C 中的多态确实是很特殊的)分为静多态和动多态(也就是静态绑定和动态绑定两种现象),静动的区别主要在于这种绑定发生在编译期还是运行期,发生在编译期的是静态绑定,也就是静多态;发生在运行期的则是动态绑定,也就是动多态。

静多态可以通过模板和函数重载来实现(之所说C 中的多态主要还是因为模板这个东西),下面举两个例子:

1)函数模板

template

T max(const T& lsh, const T& rhs)

{

return (lsh > rhs) ? lsh : rhs;

}

返回两个任意类型对象的最大值(对象),前提是该类型能够使用>运算符进行比较,并且返回值是bool类型。

使用:

int a = 3; int b = 4;

cout rhs) ? lsh : rhs;

}

即将所有的T替换成int;

当你调用max(c, d)时就自动生成一个函数

float max(const float& lsh, const float& rhs)

{

return (lsh > rhs) ? lsh : rhs;

}

之所以说开始的函数定义是函数模板,就是因为他就像个模子似的,你可以用铝作为原料也可以用石膏或者铜。

2)函数重载:

int max (int a, int b)

{

return (a > b) ? a : b;

}

int max (int a, int b, int c)

{

return max(max(a, b), c);

}

两个函数名称一样,参数类型或个数不完全相同,返回值一样(这个不重要)。

使用:

int a = 3, b = 4, c = 5;

cout

T max(const T& lsh, const T& rhs)

{

return (lsh > rhs) ? lsh : rhs;

}

template

T max(const T& a, const T& b, const T& c)

{

return max(max(a, b), c);

}

使用

float a = 3。

6, b = 1。2, c = 7。8;

cout func();

输出:

B::func()

编译期是不调用任何函数的,编译器编译到a->func()时只是检查有没有语法问题,经过检查没有。

编译器并不知道调用的是A版本的func()还是B版本的func(),由于a是一个指向B对象的指针,所以a只知道它指向的是一个A类型(或者能转换成A类型)的对象。通常集成体系就说明了(由于是公有继承)B是一种A。在运行期,a要调用a所指向对象的func()函数,就对它指向的对象下达调用func()的命令,结果a所指向的是一个B对象,这个对象就调用了自己版本(B版)的func()函数,所以输出时B::func()

总结:

在编译期决定你应该调用哪个函数的行为是静态绑定(static-binding),这种现象就是静多态。

在运行期决定应该调用哪中类型对象的函数的行为是动态绑定(dynamic-binding),这种现象就是动多态!

注:由于这是我花了有限的时间总结的,语言应用能力比较差,还有比如类模板(静多态和动多态组合的情况)都没有说,最近比较忙,请见谅!

如果还不是很懂,我建议你看C Primer 4th Edition,讲的比较清晰,但是比较零散!。

全部

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值