Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22541
  • 博文数量: 5
  • 博客积分: 250
  • 博客等级: 二等列兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-13 09:44
文章分类
文章存档

2014年(1)

2008年(4)

我的朋友
最近访客

分类: C/C++

2008-12-13 14:01:19

什么是多态:是指同样的消息被不同类型的对象接受时导致的不同的行为。

多态分为两种:通用的多态和特定的多态。两者的区别是前者对工作的类型不加限制,允许对不同类型的值执行相同的代码;后者只对有限数量的类型有效,而且对不同类型的值可能要执行不同的代码。
通用的多态又分为参数多态(parametric)和包含多态(inclusion);特定的多态分为过载多态(overloading)和强制多态(coercion)。

强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,编译程序一般都会进行强制多态。程序员也可以显示地进行强制多态的操作(Casting)。举个例子,比如,int+double,编译系统一般会把int转换为double,然后执行double+double运算,这个int-》double的转换,就实现了强制多态,即可是隐式的,也可显式转换。

过载(overloading)多态:同一个名(操作符﹑函数名)在不同的上下文中有不同的类型。程序设计语言中基本类型的大多数操作符都是过载多态的。通俗的讲法,就是c++中的函数重载。在此处中“overload”译为“过载”,其实就是所谓的“重载”,也许“overload”就应翻译为“过载,重载”吧,那“override”就只能是“覆盖”了。

参数多态:采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。个人感觉是“应该像C++中的模板类”吧,不知道对不对?

包含多态:同样的操作可用于一个类型及其子类型。(注意是子类型,不是子类。)包含多态一般需要进行运行时的类型检查。-----------------对于这个概念,我的理解是虚函数“virtual---override”机制。

 

强制多态

  强制多态(coercion)
  编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,
  编译程序一般都会进行强制多态。程序员也可以显示地进行强制多态的操作(Casting)。
  要注意的是并不是任意两个类型之间都可以进行强制多态。在不同类型之间实现强制多态,通常需要执行不同的转换操作。强制多态的原则是:将值集较小(即占用存储空间较小)的类型,变换成值集包含了前者(即占用存储空间较大)的类型,反之,应当注意可能发生的对值的损伤(特别是在使用Casting时)。
  有时,强制多态与过载多态是混合出现的。例如,对于表达式1+2; 1.0+2; 1+2.0; 1.0+2.0;
  中出现的多态,就会有多种解释:
  ·操作符+有四种过载多态;
  ·操作符+只有一种:double * double -> double, 要将参与运算的整数强制变换成浮点数;
  ·操作符+有两种过载多态:int * int -> int 和 double * double -> double,要将混合运算中的整数强制变换成浮点数。
 
 
过载(overloading)多态:同一个名(操作符﹑函数名)在不同的上下文中有不同的类型。程序设计语言中基本类型的大多数操作符都是过载多态的。通俗的讲法,就是c++中的函数重载。在此处中“overload”译为“过载”,其实就是所谓的“重载”,也许“overload”就应翻译为“过载,重载”吧,那“override”就只能是“覆盖”了
 
包含多态:虚函数里体现

C++学习------强制多态的例子

#include<iostream.h>
class Parent
{
public:
    void test()
    {
        cout
<<"这是父类的test()"<    }
    virtual test2()
    {
        cout<<"
这是父类的test2()"<    }
};
class Child:public Parent
{
public:
    void test()
    {
        cout<<"
这是子类的test()"<    }
    virtual test2()
    {
        cout<<"
这是子类的test2()"<    }
};
void main()
{
    Parent *Pa
=new Child();//强制多态
    Pa-
>test();//调用父类的
    Pa->test2();//
调用子类的
    Parent p;
    p.test2();//
调用父类的
    Child c;
    c.test2();
    //Child *Cl=new Parent();//ERROR
    //Cl->test();
}

阅读(1053) | 评论(0) | 转发(0) |
0

上一篇:大端模式和小端模式

下一篇:华为笔试题

给主人留下些什么吧!~~