Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4201167
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: C/C++

2008-12-21 10:02:30

引入两个概念:

1、静态绑定(static bingding),也叫早期绑定,简单来说就是编译器在编译期间就明确知道所要调用的方法,并将该方法的地址赋给了Call指令的funcaddr。因此,运行期间直接使用Call指令就可调用到相应的方法。

2、动态绑定(dynamic binding),也叫晚期绑定,与静态绑定不同,在编译期间,编译器并不能明确知道究竟要调用的是哪一个方法,而这,要知道运行期间使用的具体是哪个对象才能决定。

我们这里只关心动态绑定。C++中的多态就是通过动态绑定实现的。

多态就是允许客户通过统一的方式调用不同的对象,甚至是那些不同类的对象。C++通过动态绑定和虚函数机制来实现多态。

多态实际上就是泛型(generic)。所谓泛型就是指我们不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式,无论是数据结果还是算法。

下面对多态进行总结:

1、通过覆盖父类的方法来实现,在运行时根据传递的对象,来调用相应的方法。

2、简单概括多态性:当我们将子类对象的指针传给声明为父类的一个对象变量,如果子类有这个方法就调用子类的方法,如果子类没有这个方法就调用父类的这个方法。

3、多态性的好处:它可以在运行的时候,根据传递不同对象,来调用不同对象的方法。

多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。

下面举个例子:

class Shape

{

public:

     //虚函数,使用动态绑定(请观察没有virtual的情况,程序的结果)

     virtual void draw()

     {

         cout<<"Draw"<

     }

};

 

class Square:public Shape

{

public:

     void draw()

     {

         cout<<"Draw Square"<

     }

};

 

class Circle:public Shape

{

public:

     void draw()

     {

         cout<<"Draw Circle"<

     }

};

 

void main()

{

     Shape* pShape = NULL;

 

     pShape = new Circle();

     pShape->draw();//输出:Draw Circle

     delete pShape;

     pShape = NULL;

 

     pShape = new Square();

     pShape->draw();//输出:Draw Square

     delete pShape;

     pShape = NULL;

}

阅读(1731) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~