1 子类拷贝构造和拷贝赋值
2 多重继承
1)一个子类同时继承多个基类
2)向上造型,会自动地址偏移
3)名字冲突问题
解决--》显示加作用域限定
4)钻石继承问题
A
/ \
B C
\ /
D
解决--》虚继承
=========================
今天继续多态
二十二 多态(Polymorphic)
1 多态的概念
如果将基类中的某个成员函数声明为虚函数,那么子类中与该函数具有相同原型的成员函数就也是虚函数,并且对基类中的版本形成覆盖。
这时,通过指向子类对象的基类指针,或者通过引用子类对象的基类引用,调用虚函数,实际被调用的将是子类中的覆盖版本,而不是基类中原始版本,这种语法现象称为多态。
2 虚函数覆盖的条件
1)只有类的成员函数才能被声明为虚函数,全局函数和静态成员、构造函数都不能声明为虚函数。
2)只有基类中以virtual关键字修饰的成员函数才能作为虚函数被子类覆盖,而与子类的virtual关键字无关。
3)虚函数在子类和基类中必须有相同的函数签名,即相同函数名和形参表、常属性。
4)如果基类的虚函数返回类类型以外数据,那么该函数在子类的覆盖版本必须返回相同类型。
5)如果基类的虚函数返回类类型的指针(A*)或引用(A&),那么允许子类的覆盖版本返回其子类类型的指针(B*)或
引用(B&)--类型协变。
class A{};
class B:public A{};
======================================
3 多态的条件
1)多态的特性除了要在基类中声明虚函数,并在子类中形成有效的覆盖,还必须通过指针或引用来调用虚函数,才能表现出来。
2)调用虚函数的指针也可能是this指针,只有它是一个指向子类对象的基类指针,同样可以表现多态的语法特性。
4 纯虚函数、抽象类、纯抽象类
1)纯虚函数
virtual 返回类型 函数名(形参表)[const] = 0;
2)抽象类
包含纯虚函数的类就为抽象类,抽象类不能被实例化为对象;如果子类没有覆盖抽象基类中的纯虚函数,那么该子类就也是一个抽象类。
3)纯抽象类
如果一个抽象类中的所有成员函数都是纯虚函数,那么该类就是一个纯抽象类。
5 多态语法特性实现原理(了解)
参考poly.jpg
6 虚析构函数
如果将基类的析构函数声明为虚函数,那么子类的析构函数就也是一个虚函数,并且对基类的虚函数构成有效的覆盖,也可以表现多态的特性。
这时delete一个指向子类对象的基类指针,实际被调用的将是子类的析构函数,而子类析构函数会自动调用基类的析构函数,避免内存的泄露。
=======================================
小项目《薪资计算》
员工
/ | \
技术 经理 销售
\ / \ /
技术主管 销售主管
员工的属性:
姓名、工号、职位级别、基本工资、绩效工资、出勤率
经理:绩效奖金(元/月)
技术员:研发津贴(元/小时)
销售员:提成比率(百位之几)
薪资=基本工资+绩效工资
基本工资=职位级别额度*出勤率
绩效工资 因职位不同而异
普通员工:基本工资一半
经理:绩效奖金*绩效因数(输入)
技术员:研发津贴*工作小时数*进度因数(输入)
销售员:销售额度(输入)*提成比率
技术主管:(技术员绩效工资+经理绩效工资)/2
销售主管:(销售员绩效工资+经理绩效工资)/2
结果:打印员工数据,输入必须输入必要数据,计算薪资