静态多态:
多态就是多种形态:函数重载就是可以让函数名有多种形态表现出来,由于我们的参数传入的个数不同,类型不同,或者顺序不同,都可以让函数名有多种形态来表现。运算符重载就是让我们的这些符号,加减乘除这些符号有多种形态表现出来,对于自定义的类型也可以加减乘除,这些都属于静态多态。
动态多态:
通常我们说的这种多态是动态多态,派生类和虚函数运行时多态。
在C++允许父子之间类型转换?,它不需要强制类型转换,父类的引用可以直接指向子类的对象?
重载:是函数名相同,参数是不一样的,我们叫重载。
重写:函数的返回值相同,函数名要相同,形参的内容(参数列表:就是函数中括号里面的形参)也要相同,我们才叫重写。
函数前面加上virtual 关键字,变成虚函数,那么编译器编译的时候不能确定函数调用了。
上面示例代码中动物类如果没有virtual关键字修饰的话,动物类就是一个空类,大小一个字节,只是为了区分
当在猫类里面没有发生重写时,猫类继承了动物类,因为没有发生重写,所以是继承的是动物类中 的函数,如下图
当猫类中重写动物类中的同名函数时,如下图:
总结如下:
不使用多态实现计算器
使用多态的计算器:
总结:C+开发提倡利用多态设计程序架构,因为多态优点很多。
纯虚函数:在第一个示例中,我们在动物类(也就是父类中)写的虚函数,我们的本意是传入什么动物让什么动物说话,并没有想要调用动物类(父类)中虚函数。所以我们就会发现父类中的虚函数用不到,因此我们可以把这个虚函数写为纯虚函数了。当类中出现了纯虚函数后,我们就把这这个类叫做抽象类。
1、它无法实例化对象,无论是在栈上还是在堆上。
2、子类必须重写抽象类中的纯虚函数,否者子类也属于抽象类,子类也无法实例化对象。
?纯虚析构需要在类内声明,还需要再类外实现。
- 什么情况下需要虚析构和纯虚析构,再子类中如果有一些属性(变量数据)开辟到了堆区,所以需要走子类中的析构代码,如果使用多态是走不到(不经过)子类的析构,所以我们再父类中才加上虚析构和纯虚析构。
- 不管是虚析构还是纯虚析构都是解决,多态中析构时不经过子类中析构代码的问题。
?电脑组装需求:
?电脑组装的实现: