佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 5366|回复: 30

学C++却不懂 polymorphism, 只不过是个三流的编码员

  [复制链接]
发表于 4-10-2010 08:14 PM | 显示全部楼层 |阅读模式
作为一个拥有3年C++开发经验的人,    如果你问我 C++ 最重要的基础是什么?  我的答案是polymorphism,   学C++至少应该学会的技术才有资格说懂C++的 是什么?    答案是用来实现 polymorphism 的虚拟函数

polymorphism 是 OO 的核心概念.   遗憾的是,很多人学习C++却不懂为什么要 使用 虚拟函数.  也不了解它的威力在哪里.
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
LZ 给个例子来让我瞧瞧。
回复

使用道具 举报

 楼主| 发表于 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 的概念。

其实我要的是现实上的应用例子。
回复

使用道具 举报

Follow Us
 楼主| 发表于 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.
回复

使用道具 举报


ADVERTISEMENT

发表于 8-10-2010 09:28 AM | 显示全部楼层
本帖最后由 chrizyuen2 于 8-10-2010 09:31 AM 编辑

最经典而却很成功的 polymorphism 当然是warcraft.

  1. class WarcraftUnit{
  2.   bool isInvulnerable;
  3.   bool isMoveable;
  4.   int movespeed;
  5.   int attackspeed;
  6.   int armor;
  7.   int healthpoint;
  8.   int manapoint;
  9.   virtual HResult Attack();
  10.   virtual HResult Move();
  11.   virtual HResult Stop();
  12. }
复制代码
回复

使用道具 举报

发表于 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.叫();
}
回复

使用道具 举报


ADVERTISEMENT

发表于 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 07:55 PM


没有看过这本书哦,有看过就不会半桶水了啦

我应该比楼主的标题更严重,直接在九流之外--完全不入流
回复

使用道具 举报

发表于 8-10-2010 08:02 PM | 显示全部楼层
没有看过这本书哦,有看过就不会半桶水了啦

我应该比楼主的标题更严重,直接在九流之 ...
vxion 发表于 8-10-2010 08:01 PM


我也是
回复

使用道具 举报

发表于 8-10-2010 08:09 PM | 显示全部楼层
我也是
宅男-兜着走 发表于 8-10-2010 08:02 PM


你也是什么?

没有看过那本书,还是跟我一样第10流?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 12-11-2025 08:43 AM , Processed in 0.136409 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表