Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062412
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类:

2010-03-30 21:21:27

向上映射(upcasting)
什么是向上映射
将派生类的对象、引用或指针转变为基类对象、引用、指针的活动被称为向上映射。
例如:
enum note { middleC, Csharp, Cflat };
 
class instrument
{
public:
   void play(note) const
   {
   }
};

class wind: public instrument
{
};

void tune(instrument & i)
{
   //……
   i.play(middleC);
}

main(){
   wind flute;
   tune(flute);    //向上映射
}

为什么要向上映射?
继承的最重要的方面不是它为新的派生类提供了一些可以复用的数据结构或者函数,而是在于它描述了原来的基类和新派生的派生类之间的这样一种关系——“新类是已存在类的一种具体的类型”
为什么被称作向上映射,而不是向下、向左、向右映射?

类继承关系图的传统画法中通常都是将基类画在上层,将派生类画在下层。例如上面的例子中有:
 


向上映射就是指将下面的对象映射成上面的对象。
什么能够向上映射
向上映射总是安全的。因为是从更专门的类型映射到更一般的类型——对于这个类接口可能出现的唯一的情况是它失去成员函数或者成员变量,而不会增加它们。这就是编译器允许向上映射而不需要显式说明或者作标记的原因。
危机:
class base
{
public:
    void print()
    {
        cout<<"base class"<     }
};

class derived:public base
{
public:
    void print()
    {
        cout<<"derived class"<     }
};

void main(){
    derived d;
    base* bp=&d;
    bp->print(); //打印的并不是我们想要的"derived class"
}

危机的解决方法是多态。请参看另外一篇文章多态。 这两篇文章都出自王亚沙老师的课件。 在此谢过。





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