您的位置:首页 > 编程语言 > C语言/C++

C++菜鸟笔记之多态公有继承

2013-03-24 21:08 633 查看
关于类继承,派生类对象除了会继承使用基类的方法(即对基类的方法不作修改)外,也可能希望同一个方法在派生类和基类中的行为是不同的。这种较为复杂的行为成为称为类的多态,即具有多种形态,不同的类对象调用该方法时,其行为不同。

如何实现类的多态公有继承:

1、在派生类中重新定义基类的方法

比如在基类Object和派生类Objectplus中都声明并定义了function()函数,则Object::function()表示调用基类的方法,Objectplus::function()表示调用派生类的方法。

2、使用虚方法

即使用关键字virtual,这个方法比上一个要复杂些。其声明格式是,如果function()函数在基类和派生类中的行为不同,就在基类和派生类中声明原型的时候在原型前加上virtual关键字。例如,在基类中声明格式是“virtual void function();”,在派生类中声明格式也是“virtual void function();”,当然两个函数的定义肯定是不同的。

使用virtual有一个特别突出的好处!!!

如果方法是通过引用或指针调用的、而不是对象调用时,它将确定使用哪一种方法。即如果没使用virtual,程序将根据引用类型或指针类型选择方法。如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。

例如,如果function()不是虚拟的,则程序如下:

/////////

Object   ob1(......);

Objectplus  ob2(......);

Object & b1=ob1;

Object & b2=ob2;

ob1.function();//使用Object::function()

ob2.function();//使用Object::function()

////////

如果function()是虚拟的,则程序如下:

/////////

Object   ob1(......);

Objectplus  ob2(......);

Object & b1=ob1;

Object & b2=ob2;

ob1.function();//使用Object::function()

ob2.function();//使用Objectplus::function()

////////

注意另外的一点是,如果在基类中方法被声明为虚拟的,它在派生类中将自动成为虚拟方法。虚拟方法在以后的学习中将非常有有用。

还有一个要注意的,在基类中经常要声明一个虚拟析构函数。目的是为了确保释放派生对象时,按正确的顺序调用析构函数。

为什么使用虚拟析构函数???

比如,

Object * ob2;

ob2=new  Objectplus(.......);

ob2是使用new分配的对象,当我们使用delete释放该对象时,如果析构函数不是虚拟的,则将只调用对应于指针类型的析构函数,也就是只有Object的析构函数被调用,即使指针指向的是Objectplus对象。如果析构函数是虚拟的,将调用相应的对象类型的析构函数。因此,如果指针指向的是Objectplus对象,将调用Objectplus的析构函数,然后自动调用基类的析构函数。所以说是用虚拟函数能够确保按正确顺序调用析构函数。尤其是当派生类的析构函数包含某些操作时,基类的析构函数必须是虚拟的,即使基类的虚构函数没有任何操作!

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息