多态
来源:互联网 发布:软件版权说明 编辑:程序博客网 时间:2024/06/07 07:03
多态
绑定
英文
例子
覆盖(重写:override)与虚函数的使用
覆盖产生的三个条件
1.继承
2.子类覆盖(重写)父类虚函数
3.父类的指针/引用指向子类
多态的效果:同样的语句调用产生不同的效果,是设计模式的基础,框架的基石。
虚函数定义的规则
1.构造函数不可以是虚函数,因为在构造时对象还是一片未定型的空间,只有构造完成后,对象才是具体的实例。但是构造函数可以调用虚函数。
2.析构函数通常作为虚函数出现,且析构函数可以调用虚函数。
3.内联函数不可以为虚函数,因为内联函数不能在运行中动态的确定位置。即使虚函数在类的内部定义,但是在编译时,系统仍然将其看为非内联函数。
4.静态成员函数不能是虚函数,因为静态成员时相对于类而言的,不受限于某一个对象。
5.只有类的成员函数才能说明为虚函数,因为虚函数仅适用于有继承关系的对象,所以普通函数不可以声明为虚函数。
6.如果有虚函数在基类与派生类中出现,仅仅是名字相同,而形参不同,或者返回值类型不同,有无
const
,那么即使加上了virtual
,也不会进行覆盖。子类以
new
的方式进行实例化,指针赋值给父类指针,delete
父类指针时,只调用父类的析构函数,不调用子类的析构函数。因此将类的析构函数写为虚函数。
多态实现的原理分析
当类中声明虚函数时,编译器会为这个类生产一个专门的虚函数表(基类和派生类中各自会生成一个),这个虚函数表是由该类中的一个隐藏的vptr指向。
虚函数表:是一个存储类成员函数指针的数据结构。
虚函数表是由编译器自动生成和维护的,virtual函数会被编译器放入虚函数表中。
存在虚函数时,每个对象当中都会有一个指向虚函数表的指针(vptr)。
纯虚函数
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。
class 类名 { virtual 返回值类型 函数名(函数参数列表)= 0;}
抽象类
包含纯虚函数的类,称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。