Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1591424
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2006-11-20 17:37:31

     实现一般化的动作对于一个面向对象的语言来说是及其重要的,而在C++中为了能够实现这个一般化的操作,于是就采取了虚拟的机制。虚拟的目的就是为了实现多态,即the abilities to assume many forms,采取同一种形式,但却具有不同的作用。实现了多态,那么就可以用父类的一般化的动作来引起不同子类的行为。

     这样说起来,有些绕口,也不是很好理解,让我用一个通俗的说法来解释我的理解:一个老子可以有多个儿子,而每个儿子都具有老子的基本能力,一个俗语可以很好的解释这一点,即龙生龙,凤生凤,老鼠的儿子会打洞。只要是老鼠的儿子,它都具有老鼠老子的能力,即打洞,至于打洞的快慢、深浅、大小等就要看儿子是否发展了老子的这种本领,即在子类中是否改写了父类的行为。好,让我们看一个简单的例子:

class CA
{
public:
    CA(){};
    ~CA(){};

    virtual void Create(){cout << "CA::Create" << endl;}
    virtual void Destroy(){cout << "CA::Destroy" << endl;}
}

class CB : public CA
{
public:
    CB(){};
    ~CB(){};

    void Create(){cout << "CB::Create" << endl;}
}

CB objB; // 声明一个类CB的一个实例,会调用类CB的构造函数CB()
objB.Create();// 在这里,由于类CB改写了类CA的虚拟函数Create(),所以这里面它调用的
              // 是类CB的函数CB::Create,输出的结果也是"CB::Create",也就是说儿子CB
              // 虽然具有和老子CA一样的能力Create,他们的形式是一样的,名称也一样,调用
              // 方法也一样, 但行为结果不一样,于是他们Create出来的东西也不一样,
              // 老子Create出来输出来的是"CA::Create", 但儿子输出的却是"CB::Create"

objB.Destroy(); // 这里儿子CB没有改写老子CA的虚拟函式Destroy, 所以它具有的能力跟
                // 老子一模一样,没有任何的发展进步,于是它的结果就是老子的结果,
                // 即"CA::Destroy"
// 对象objB的生命结束时自动调用CB的析构函数~CB()把自己干掉(其实这里什么也没有做)

子类如果改写了父类的行为,那么调用的便是子类自己的行为,子类如果没有改写父类的行为,那么它使用的就是父类的行为。

阅读(2719) | 评论(2) | 转发(0) |
0

上一篇:虚拟与多态(C++)

下一篇:调用方式(VC/MFC)

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

chinaunix网友2010-02-07 19:09:57

你的例子并没有说明多态,应该用下面这个例子才能说明多态性。 CA* pobjA = new CB(); pobjA.Create();// 这时输出是CB::Create,这才能展现出c++的多态性呀! delete pobjA;

chinaunix网友2010-02-07 19:09:57

你的例子并没有说明多态,应该用下面这个例子才能说明多态性。 CA* pobjA = new CB(); pobjA.Create();// 这时输出是CB::Create,这才能展现出c++的多态性呀! delete pobjA;