浅析C++多态

来源:互联网 发布:淘宝网店模板制作教程 编辑:程序博客网 时间:2024/06/01 21:14

一.什么是多态?

C++是一种面向对象的语言,其三种基本特征为:封装,继承和多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!本片文章主要解释了三大特性中的多态。

多态是面向对象程序设计的一个重要特征。利用多态性可以设计和实现一个易于扩展的系统。多态就是一个事物有多重状态,在C++程序设计中,多态性是指具有不同功能的函数可以用一个函数名,这样就可以用同一个函数名实现不同的功能。

从对象的类型来看,多态又被分为静态动态和动态多态。

静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用的那个函数,如果有相对应的函数就调用该函数,否则出现编译错误。

动态多态:在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。因此动态多态又称为运行时多态。    

动态多态和虚函数主要研究的是:当一个基类被继承为不同的派生类时, 各派生类可以使用与基类成员相同的成员名,如果在运行时用同一个成员名调用类对象的成员,那么会调用哪一个对象的成员?也就是,通过继承而产生了相关的不同派生类,与基类成员同名的成员在不同的派生类中有不同的含义。即“一个接口,多个方法”。

二.多态的实现

多态成立的三个条件 
1 要有继承 
2 要有函数重写->虚函数 
3 要有父类指针(父类引用)指向子类对象 

重载、重写、多态 
函数重载 
必须在同一个类中进行 
子类无法重载父类的函数,父类同名函数将被名称覆盖 
重载是在编译期间根据参数类型和个数决定函数调用 
函数重写 
必须发生于父类与子类之间 
并且父类与子类中的函数必须有完全相同的原型 
使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 
多态是在运行期间根据具体对象的类型决定函数调用

虚函数:

class Base{public:virtual void FunTest1(){cout << "Base::FunTest1" << endl;}};class Drived :public Base{public:virtual void FunTest1(){cout << "Drived::FunTest1" << endl;}};void FunTest(){Base b;Drived d;Base &rd = d;d.FunTest1();b.FunTest1();rd.FunTest1();}int main(){FunTest();system("pause");return 0;}

测试结果:

Drived::FunTest1
Base::FunTest1
Drived::FunTest1

虚函数使用方法:

1、在基类中用virtual声明成员函数是虚函数。(在类外定义时不需要再加virtual)
2、在派生类中重新定义虚函数,要求函数名,函数类型,参数个数和类型完全与基类中的虚函数相同,根据自己的需
求定义函数体。C++中规定,当一个成员函数被声明为虚函数后,在派生类中的同名函数都是虚函数。如果在派生类
中没有对虚函数重新定义,则派生类简单的继承基类的虚函数。
3、定义一个指向基类对象的指针变量,并使他指向同一类族中需要调用该函数的对象。通过该指针变量调用此虚函数
,就相当于指针变量所指向的对象的同名函数。
4、函数重载处理的是同一层次上的同名函数问题,因此是横向重载。虚函数处理的是类的派生层次上的同名函数问题
,属于纵向重载。与重载不同的是,虚函数要求函数的首部完全相同。
5、函数重载和通过对象名调用的虚函数,在编译期间即可确定调用的虚函数属于哪一个类,其过程称为静态关联。
在运行阶段,基类变量先指向某一个类对象,然后通过此指针变量调用该对象中的函数,这种过程称为动态关联。
纯虚函数和抽象类:

1、什么是纯虚函数
  有时在类中将某一成员声明为虚函数,并不是因为基类本身的要求,而是因为派生类的需求,在基类中预留一个函数
名,具体功能留给派生类区定义。这种情况下就可以将这个纯虚函数声明为纯虚函数。其一般形式是:
       virtual 函数类型 函数名 (参数列表) =0;
注意:
  纯虚函数没有函数体。最后的“=0”只是一种形式,告诉编译系统,它是一个纯虚函数,留在派生类中定义,并没
有实际意义。纯虚函数只有在派生类中定义了之后才能被调用。如果在一个类中声明了纯虚函数,而在派生类中没有
对该函数定义,则该虚函数在派生类中仍然为纯虚函数。
2、抽象类
  含有纯虚函数的类就成为抽象类。抽象类只是一种基本的数据类型,用户需要在这个基础上根据自己的需要定义处各
种功能的派生类。抽象类的作用就是为一个类族提供一个公共接口。抽象类不能定义对象,但是可以定义指向抽象类
的指针变量,通过这个指针变量可以实现多态。


0 0
原创粉丝点击