龙生九子----多态

原创 2001年09月10日 16:43:00

龙生九子<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                  ----多态

作者:HolyFire

一龙生九子,子子皆不同。这个道理说的是世界上没有两个或两个以上的事物是完全相同的,事物之间有相同相似的一面,当然也有不同相异的一面。只有将不同的和相同的都考虑进来,才能完整的表达事物。

事物的属性有着不同的一面。我们知道人感知事物的一个途径是观察,用对不同光线的反应来识别物体,所以我们给出事物的一个属性,颜色。有时候一些物体的颜色是固定的,白色的云,蔚蓝的天空,碧绿的草地,不禁令人神游太虚。

但有些方面是不确定的,有一句话说道:“月有阴晴圆缺,人有悲欢离合”,这句话还不足以说明这个道理。我们中文里有时候会省略一些部分,“今天你吃了没有?”吃的是什么,“早饭”,“下午茶”,“面包”,不知道。这里将吃东西抽象化了,这句话可以在早上说,中午说,晚上说,任何一个适合的时间段都可以说。感兴趣的地方出现了,我们不知道吃什么东西,什么时候吃,但是却可以使用它,简要的表达一下你的问候。这样简单的设下伏笔,在具体需要的环境才用具体表现出来具体的用法,被广泛运用在生活中。“我砍!”表达了一个人要做的动作,具体砍什么,只有感兴趣的人才会去关注。“我生病了。”表达了一个人的状态,具体生的什么病,不是人人都想知道的。

多态--就是指事物不同的方面

多态是一种复杂的应用,要全面的阐述它很难,所以理解它的思想就成了重点。在不同情况下,秉承它的思想,用不同的方法实现多态。

还记得C++中的虚函数吗,我在《后入为主----虚函数》中讲过,虚函数可以动态改变,运用这个特性就能实现我们的目的了。不同的语言使用不同的方法,实现的机制就是一个类型提供的接口可以改变。这样就能体现不同这个思想了。

为了更好理解,我们用C++实现一个例子。

我们知道,要生活,就要工作,工作是人的社会行为,几乎人人都在工作。世界上有形形色色的人,人的工作的区分在什么地方呢,那就是它的职业,不同职业的人做不同的事。

学生的工作就是学习,司机的工作是开车,小贩的工作是卖商品,程序员的工作是编写代码。

现在我们分析一下,世界上有很多人,人都要工作

{ 工作 = 未确定 }

学生的工作是学习

学生 { 人 , 工作 = 学习 }

司机的工作是开车

司机 { 人 , 工作 = 开车 }

小贩的工作是贩卖

小贩 { 人 , 工作 = 贩卖 }

程序员的工作是编程

程序员 { 人 , 工作 = 编程 }

#include <iostream>

unsing namespace std;

class Man{

public:

    virtual void Work( void ) = 0;//纯虚函数,没有确定的职业就不知道他的工作。

};

class Student : public Man{

public:

    void Work( void ) { cout << "I'm Learning."<< endl; };

};

class Chauffeur : public Man{

public:

    void Work( void ) { cout << "I'm Driving."<< endl; };

};

class Vendor : public Man{

public:

    void Work( void ) { cout << "I'm Vending."<< endl; };

};

class Programer : public Man{

public:

    void Work( void ) { cout << "I'm Coding."<< endl; };

};

void main()

{

    Man * which[5];

    which[0] = new Student;

    which[1] = new Chauffeur;

    which[2] = new Vendor;

    which[3] = new Programer;

        which[4] = NULL;

    for( int i = 0 ; which[i] ; i++ )

       {

        which[i]->Work();

        delete which[i];

       }

}

运行结果

I'm Learning. //虚函数表指针指向的Student的虚函数表

I'm Driving.  //虚函数表指针指向的Chauffeur的虚函数表

I'm Vending.  //虚函数表指针指向的Vendor的虚函数表

I'm Coding.   //虚函数表指针指向的Programer的虚函数表

我们看到了由于使用了虚函数,类增加了虚函数表和虚函数表指针

which[0] = new Student;

我们分析这个指针,他指向一个Student对象,而这个指针描述的是一个Man对象,在Student对象被创建的时候虚函数表指针指向了Student的虚函数表,所以which[0]->Work();调用的是在Student的虚函数表里查出来的Student::Work();其它的以此类推,不难得到运行的结果。

不同职业的类用同一个接口实现了不同功能,我们的目的达到了,代码很简洁,意图很明显,这里C++又一次很好的实现了面向对象的思想。

                                          2001/8/17

丁宁 

《灵飞经5·龙生九子》第二十三章 力压须眉(上)

原来,西城武学不同于天下任何武功,梁思禽打遍天下,凭借的本是一门“周流六虚功”。周流六虚,法用万物,借力于天地, 伤人于无形。这门武功修炼极难,如果天资不够,练来必有性命之忧。因此缘故,梁思禽将“周流...
  • colademo
  • colademo
  • 2013年08月10日 20:55
  • 1268

龙生九子

龙生九子  中国民间有“一龙生九子,九子各不同”的说法。说是一位龙母,生了九个儿子,这九个儿子各有各的长相,脾气和爱好也各不相同。明代一些学人笔记,如陆容的《菽园杂记》、李东阳的《怀麓堂集》、杨慎的《...
  • hurtmanzc
  • hurtmanzc
  • 2006年10月29日 18:52
  • 1629

C++多态简析——静态多态与动态多态

多态:顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。并且多态分为静态多态和动态多态。静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函...
  • stay_the_course
  • stay_the_course
  • 2017年02月16日 16:01
  • 1693

设计模式之三:工厂方法模式—多态工厂的实现

简单工厂的严重问题: 当系统中需要引进新产品时,静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,违背了开闭原则 引入工厂方法模式: 针对不同的产品提供不...
  • wujunwen
  • wujunwen
  • 2016年09月22日 15:25
  • 693

关于虚函数和多态(很好的解释)

C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
  • foreverhuylee
  • foreverhuylee
  • 2014年07月17日 12:15
  • 2155

多态的实现原理——多态的理解

多态的原理: 当类中声明虚函数时,编译器会在类中生成一个虚函数表(基类和派生类中各自都会生成一个)虚函数表是一个存储类成员函数指针的数据结构虚函数表是由编译器自动生成和维护的virtual函数会...
  • len_yue_mo_fu
  • len_yue_mo_fu
  • 2016年08月09日 10:37
  • 707

对多态变形引擎背后方法的概述

译者注:SMEG(Simulated Metamorphic Encryption Generator)是一个影响颇大的多态变形引擎,它使用的方法受到众人的仿效。虽然本文没有详细介绍SMEG中所使用的...
  • whatday
  • whatday
  • 2014年04月06日 22:20
  • 1896

初学者是如何理解多态

摘要:北京领卓转载
  • bjlingzhuo
  • bjlingzhuo
  • 2016年04月12日 16:20
  • 1837

面向对象在javascript中的三大特征之多态

多态 从某种意义上来说,多态是面向对象中重要的一部分,也是实施继承的主要目的。 一个实例可以拥有多个类型,它既可以是这种类型,也可以是那种类型,这种多种状态被称为类的多态。 继承 继承本身是多态的...
  • Tyro_java
  • Tyro_java
  • 2016年04月19日 15:18
  • 2636

多态的使用和概述以及弊端和好处

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • qq_28483283
  • qq_28483283
  • 2016年03月10日 21:44
  • 2772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:龙生九子----多态
举报原因:
原因补充:

(最多只允许输入30个字)