多态

来源:互联网 发布:软件版权说明 编辑:程序博客网 时间:2024/06/07 07:03

多态

分类 绑定 英文 例子 编译时多态 早绑定 overload 函数和运算符重载 运行时多态 晚绑定 override 继承和虚函数

覆盖(重写:override)与虚函数的使用

覆盖产生的三个条件

1.继承
2.子类覆盖(重写)父类虚函数
3.父类的指针/引用指向子类

多态的效果:同样的语句调用产生不同的效果,是设计模式的基础,框架的基石。

虚函数定义的规则

1.构造函数不可以是虚函数,因为在构造时对象还是一片未定型的空间,只有构造完成后,对象才是具体的实例。但是构造函数可以调用虚函数。

2.析构函数通常作为虚函数出现,且析构函数可以调用虚函数。

3.内联函数不可以为虚函数,因为内联函数不能在运行中动态的确定位置。即使虚函数在类的内部定义,但是在编译时,系统仍然将其看为非内联函数。

4.静态成员函数不能是虚函数,因为静态成员时相对于类而言的,不受限于某一个对象。

5.只有类的成员函数才能说明为虚函数,因为虚函数仅适用于有继承关系的对象,所以普通函数不可以声明为虚函数。

6.如果有虚函数在基类与派生类中出现,仅仅是名字相同,而形参不同,或者返回值类型不同,有无const,那么即使加上了virtual,也不会进行覆盖。

子类以new的方式进行实例化,指针赋值给父类指针,delete父类指针时,只调用父类的析构函数,不调用子类的析构函数。因此将类的析构函数写为虚函数。

多态实现的原理分析

当类中声明虚函数时,编译器会为这个类生产一个专门的虚函数表(基类和派生类中各自会生成一个),这个虚函数表是由该类中的一个隐藏的vptr指向。

虚函数表:是一个存储类成员函数指针的数据结构。
虚函数表是由编译器自动生成和维护的,virtual函数会被编译器放入虚函数表中。
存在虚函数时,每个对象当中都会有一个指向虚函数表的指针(vptr)。

纯虚函数

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。

class 类名 {    virtual 返回值类型 函数名(函数参数列表)= 0;}

抽象类
包含纯虚函数的类,称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。