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

C++多态性的理解

2017-04-15 20:30 253 查看
根据清华大学郑莉老师的书《C++语言程序设计》来总结

1 多态:是指类中具有相似功能的不同函数,使用同一个名称来实现;是对类的行为再抽象;多态是通过重载函数和虚函数来实现的。

2 继承讨论的是类与类的层次关系,多态则是考虑在不同层次的类中,以及在同一个类的内部,同名成员函数之间的关系问题,是解决功能和行为的再抽象问题。

3 多态是指类族中具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。

类型:

面向对象的多态性可以分为4类:

专用多态:

(1)重载多态:普通函数以及成员函数的重载。

(2)强制多态:将一个变量的类型加以变化。

通用多态:

(3)包含多态:研究类族中定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现。

(4)参数多态:与类模板相关联。

实现:

多态从实现的角度可以分为:

(1)编译时的多态:静态联编(重载、强制、参数),程序编译连接阶段完成。

(2)运行时的多态:动态联编(包含),程序运行阶段完成。

联编:是指计算机程序自身彼此关联的过程,就是把一条消息和一个对象的方法相结合的过程。

运算符重载:

运算符重载的实质是函数重载,在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的形参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中实现的。不能重载的运算符有5个:“.”,“*”,“::”,“? :”“sizeof”。

虚函数:

虚函数是动态联编的基础,虚函数是非静态成员函数,虚函数经过派生之后,在类族中可以实现运行过程中的多态。

根据赋值兼容规则,可以使用派生类对象代替基类对象。如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问该对象。问题是派生到的只是从基类继承来的同名成员。

解决这一问题的办法就是:如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员(如果是函数,则原型完全相同)。那么,首先在基类中将这个同名函数说明为虚函数。

这样,通过基类类型指针,就可以使属于不同派生类的不同对象产生不同的行为,从而实现运行过程中的多态。

一般虚成员函数实现的3个条件:

(1)首先类之间应满足赋值兼容规则。

(2)声明虚函数。

(3)由成员函数调用,或者通过指针、引用来访问虚函数。

如果使用对象名来访问虚函数,则联编在编译过程中就可以通过(静态联编),而无需在运行中进行。

虚析构函数:

如果一个类的析构函数时虚函数,那么,用它派生而来的所用子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针,引用时就可以动态联编,实现运行时的多态,保证使用基类类型的指针就能够调用适当的析构函数针对不同的对象进行清理工作。

抽象类:

(1)抽象类是一种特殊的类,它为一族类提供统一的操作界面,通过它为一个类族建立一个公共的接口,使类能够更加有效的发挥多态性。

(2)建立抽象类,就是为了通过它多态地使用其中的成员函数。

(3)抽象类处于其层次的上层,一个抽象类自身无法实现化,而只能通过继承机制。生成抽象类的非抽象派生类,然后实例化。但是,可以声明一个抽象类的指针和引用。

(4)抽象类是带有纯虚函数的类。

(5)抽象类派生出新类之后,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍是一个抽象类。

(6)纯虚函数:virtual 函数类型 函数名(参数表)=0;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 多态性