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的析构函数,然后自动调用基类的析构函数。所以说是用虚拟函数能够确保按正确顺序调用析构函数。尤其是当派生类的析构函数包含某些操作时,基类的析构函数必须是虚拟的,即使基类的虚构函数没有任何操作!
如何实现类的多态公有继承:
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的析构函数,然后自动调用基类的析构函数。所以说是用虚拟函数能够确保按正确顺序调用析构函数。尤其是当派生类的析构函数包含某些操作时,基类的析构函数必须是虚拟的,即使基类的虚构函数没有任何操作!
相关文章推荐
- C++:多态公有继承
- C++入门学习笔记(四)--继承与多态
- VC++编程之第二课笔记――C++的继承封装多态
- C++多态公有继承
- C++学习笔记19 多态与继承
- C++[语法]公有继承和多态
- C++之多态与继承学习笔记
- 简单理解C++的多态公有继承及虚函数
- 继承和多态和虚函数——C++学习笔记二
- C++学习笔记--继承与多态
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++ 类继承(廿一)--基类、派生类、多态继承、公有继承、私有继承、虚函数、保护继承、多重继承
- c++学习笔记之继承和多态
- 【从C到C++学习笔记】面向对象/抽象/封装/继承/多态
- C++学习笔记20 多态与继承下
- C++总结笔记(一)抽象、多态、继承
- 嵌入式开发之C++基础学习笔记4--面向对象封装继承多态
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++多态公有继承
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)