|
查看: 5368|回复: 30
|
学C++却不懂 polymorphism, 只不过是个三流的编码员
[复制链接]
|
|
|
作为一个拥有3年C++开发经验的人, 如果你问我 C++ 最重要的基础是什么? 我的答案是polymorphism, 学C++至少应该学会的技术才有资格说懂C++的 是什么? 答案是用来实现 polymorphism 的虚拟函数
polymorphism 是 OO 的核心概念. 遗憾的是,很多人学习C++却不懂为什么要 使用 虚拟函数. 也不了解它的威力在哪里. |
|
|
|
|
|
|
|
|
|
|
发表于 4-10-2010 08:29 PM
|
显示全部楼层
其实polymorphism有任何OOP都有. 不是c++专属.
瞻仰伟论, 路过...  |
|
|
|
|
|
|
|
|
|
|
发表于 4-10-2010 10:06 PM
|
显示全部楼层
|
還是有些不同,像Java就不能overload operators但C++可以。 |
|
|
|
|
|
|
|
|
|
|
发表于 7-10-2010 07:42 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 8-10-2010 12:03 AM
|
显示全部楼层
本帖最后由 protonwira 于 8-10-2010 07:45 AM 编辑
LZ 给个例子来让我瞧瞧。
宅男-兜着走 发表于 7-10-2010 07:42 PM 
polymorphism 其实是生物学名称, 更贴切地说是 遗传学. 指同一种族的生物体具有相同的特性. 比如说, 动物是父类, 派生了 卵生类 和 哺乳类。 卵生类派生了 鱼和 飞鸟, 哺乳类派生了 猴子 和 老虎.
鱼,飞鸟,猴子 ,老虎 都会叫,"叫" 这个动作就是 动物相同的特性, 所以"叫" 应该在源头的父类"动物" 里被宣告, 然后鱼,飞鸟,猴子 ,老虎继承了"叫" 这个动作。 可是动物们的 "叫" 又不尽相同,所以它们得各自在本身的class里 修改自己的 "叫"法.
因为"叫"是所有动物的特性, 当我们想call 完所有的动物 (鱼飞鸟猴子老虎) 或其中一个物种 的"叫" 这个动作时, 可以利用父类 "动物" 导出的一个物件来完成, 而不必深入去call那些物种 。 更厉害地是, 如果想加多一个 "人" 类在哺乳类之下,我们依旧用回这个object, 而不必理会"人" 类究竟有什么"叫" 法
就是说, 只用一个父类"动物"接口, 就把未来所有可能出现的 class 都概括了 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 02:17 AM
|
显示全部楼层
本帖最后由 宅男-兜着走 于 8-10-2010 02:19 AM 编辑
polymorphism 其实是生物学名称, 更贴切地说是 遗传学. 指同一种族的生物体具有相同的特性. 比如说 ...
protonwira 发表于 8-10-2010 12:03 AM 
更简短的说法是 “继承”, 也就是 Inheritance 吧? 这是 OO 的概念。
其实我要的是现实上的应用例子。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 8-10-2010 07:43 AM
|
显示全部楼层
更简短的说法是 “继承”, 也就是 Inheritance 吧? 这是 OO 的概念。
其实我要的是现实上的 ...
宅男-兜着走 发表于 8-10-2010 02:17 AM 
差之毫厘 谬之千里!
Inheritance 只是继承了父类的一组data function, 如果没有虚拟函数, 我们根本无法完成上述所说的动作, 就是利用一个父类接口 在program 执行时自动连接派生类的函数 (不管有多少派生类), 少了虚拟函数,Inheritance无用武之地 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 09:07 AM
|
显示全部楼层
更简短的说法是 “继承”, 也就是 Inheritance 吧? 这是 OO 的概念。
宅男-兜着走 发表于 8-10-2010 02:17 AM 
polymorphism != inheritance. |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 09:28 AM
|
显示全部楼层
本帖最后由 chrizyuen2 于 8-10-2010 09:31 AM 编辑
最经典而却很成功的 polymorphism 当然是warcraft.
- class WarcraftUnit{
- bool isInvulnerable;
- bool isMoveable;
- int movespeed;
- int attackspeed;
- int armor;
- int healthpoint;
- int manapoint;
- virtual HResult Attack();
- virtual HResult Move();
- virtual HResult Stop();
- }
复制代码 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 01:05 PM
|
显示全部楼层
最经典而却很成功的 polymorphism 当然是warcraft.
chrizyuen2 发表于 8-10-2010 09:28 AM 
然后? 这个class 也是要其他Class 来继承吧? 然后实现他的方法不是? |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 01:07 PM
|
显示全部楼层
本帖最后由 宅男-兜着走 于 8-10-2010 01:30 PM 编辑
其实我只是要个 实例, 比如说, 用在哪里??什么情况下会用到, 做么会用到。
酱而已 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 01:08 PM
|
显示全部楼层
本帖最后由 宅男-兜着走 于 8-10-2010 02:52 PM 编辑
差之毫厘 谬之千里!
Inheritance 只是继承了父类的一组data function, 如果没有虚拟函数 ...
protonwira 发表于 8-10-2010 07:43 AM 
好谢谢 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 04:22 PM
|
显示全部楼层
polymorphism 其实是生物学名称, 更贴切地说是 遗传学. 指同一种族的生物体具有相同的特性. 比如说 ...
protonwira 发表于 8-10-2010 12:03 AM 
请问是酱紫吗?
public abstract class 生物{
abstract void 叫();
}
public class 鸟 extends 生物{
void 叫(){
//鸟叫
}
}
public class 老虎 extends 生物{
void 叫(){
//老虎叫
}
}
public class 狗 extends 生物{
void 叫(){
//狗叫
}
}
call叫:
生物 a = new 鸟(); // 管它什么生物
a.叫(); |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 06:19 PM
|
显示全部楼层
回复 13# vxion
他们说的是 多态, 不是抽像。 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 06:26 PM
|
显示全部楼层
唉,失败下,不明白 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 06:57 PM
|
显示全部楼层
再try多一次,酱紫?
public class 生物{
void 叫(){
}
}
public class 哺乳类 extends 生物{
void 叫(){
}
}
public class 卵生类 extends 生物{
void 叫(){
}
}
public class 鸟 extends 卵生类{
void 叫(){
//鸟叫
}
}
public class 老虎 extends 哺乳类{
void 叫(){
//老虎叫
}
}
public class 狗 extends 哺乳类{
void 叫(){
//狗叫
}
}
call叫:
生物[] a = new 生物[5];
a[0] = new 狗();
a[1] = new 鸟();
a[2] = new 卵生类();
a[3] = new 老虎();
a[4] = new 哺乳类();
//全部随便乱叫
for(生物 b: a){
b.叫();
} |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 07:55 PM
|
显示全部楼层
再try多一次,酱紫?
public class 生物{
void 叫(){
}
}
public class 哺乳类 extends 生 ...
vxion 发表于 8-10-2010 06:57 PM 
你是看《大话模式设计》 一书学来的吧  |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 08:01 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 08:02 PM
|
显示全部楼层
没有看过这本书哦,有看过就不会半桶水了啦
我应该比楼主的标题更严重,直接在九流之 ...
vxion 发表于 8-10-2010 08:01 PM 
我也是 |
|
|
|
|
|
|
|
|
|
|
发表于 8-10-2010 08:09 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|