实现一般化的动作对于一个面向对象的语言来说是及其重要的,而在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()把自己干掉(其实这里什么也没有做)
子类如果改写了父类的行为,那么调用的便是子类自己的行为,子类如果没有改写父类的行为,那么它使用的就是父类的行为。
阅读(2746) | 评论(2) | 转发(0) |