多态
多态的定义:
如果有几个似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。
c++中所谓的多态是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的相应。
多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统,升级,维护,调试的工作量和复杂度
多态使用注意事项
(1)多态的发生有三个必要条件:
- 要有继承
- 要有虚函数重写
- 父类指针或引用指向子类对象
(2)如果传参是父类指针,又没有使用virtual,编译器会使用父类对象的函数
(3)虚继承和多态中的虚继承关键字virtual含义不相同
(4)迟绑定,动态判断的语句
(5)只需要析构子类,就会自动析构父类,因此将析构函数设定成虚函数。
(6)如果一个类有virtual虚函数关键字,在编译器给这个对象开辟空间时候回默认增加一个指针,vptr;函数匹配的时候会优先找虚函数表中,然后再找类中有没有静态实现的。
虚函数表
当一个类中有虚函数的时候,会在这个类中隐式生成一个虚函数指针,指向这个类拥有的虚函数表
虚函数指针会在类里占用四个字节,在父类构造函数结束之前,指针指向父类虚函数表,到子类构造开始时,指针指向子类虚函数表
(1)通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多
(2)出于效率考虑,没有必要将所有成员函数都声明为虚函数。
(3)C++编译器,执行run函数,不需要区分是子类对象还是父类对象,而是直接通过p的VPTR指针所指向的对象函数执行即可
(4)父类指针和子类指针的步长不同
- 二者指向的地址空间大小可能不同
纯虚函数
(1)不管类中有没有成员属性,只要这个类有纯虚函数就是一个抽象类,抽象类不能够实例化。
(2)如果继承类不重写纯虚函数,仍然是一个抽象类,必须重写所有纯虚函数
(3)抽象类就是接口,main函数可以只与抽象类关联,依赖倒转原则:高层业务逻辑层向抽象层,实现层向抽象层
(4)如果多继承,可以用同时两个父类指针指向该类:
class Interface
{
//......func1,func2,func3
};
class Child : public Interface
{
//......
};
Interface *if1 = new Child;
if1->func1();
if1->func3();
Interface *if2 = new Child;
if2->func2();
静态和的动态连编
(1)联编是指一个程序模块、代码之间互相关联的过程
(2)静态联编,是程序的匹配、连接在编译阶段实现,也称为早期匹配。重载函数使用静态联编
(3)动态联编是指程序联编推迟到运行时进行,所以有称为晚期联编。switch语句和if语句是动态联编的例子