标签:继承&多态
继承是面向对象的复用的重要手段。通过继承定义一个类,他们共享共有的东西,也可实现各自不同的东西。
类中有三种成员访问限定符:public,protected,private。
类的继承方式也有三种:public继承,protected继承,private继承。
实现一个简单的继承关系:
注:Bsae为基类(父类),D为派生类(子类)
三种继承关系下基类成员在派生类的访问关系变化:
(1)public成员在子类可以访问,在类外也可以访问。
(2)protected成员在子类中可以访问,但在类外不能访问。
(3)private成员在子类和类外都不可以访问。
继承与转换---赋值兼容规则
(1)子类对象可以赋值给父类对象
(2)父类对象不可以赋值给子类对象
(3)父类的指针或者引用可以指向子类
(4)子类的指针或者引用不可以指向父类(可以通过强制类型转换)
注:每一个子类中都包含有父类。
单继承&多继承
1.单继承---一个子类只有一个父类
2.多继承---一个子类有多个父类
注:Student类继承Person类,Graduate类继承Person类
Assistant类继承Student类和Teacher类
菱形继承
菱形继承的对象模型:
由模型中可以看出:
Assistion的对象中有两份Person成员。在测试过程中也能会造成二义性。Student类和Teacher类都继承Person,存在两份_name,使得数据冗余。
为了解决菱形继承的二义性和数据冗余问题,引入虚继承
菱形虚继承对象模型
虚函数&多态
虚函数---类的成员函数前面加上virtual关键字,则这个成员函数为虚函数。
多态---派生类重写基类的虚函数实现多态。(虚函数重写)
多态的实现---虚表。
2.探索单继承的对象模型
注:在监视中只能显示d中所包含的父类的虚函数。(其实,虚函数表中还有子类的fun3)。因子类中重写了父类中虚函数fun1,所以父类中的fun1被子类的覆盖。
3.探索多继承的对象模型
注:D类继承Base类和Base1类。因子类中重写了父类的虚函数fun1,所以Base和Base1类的fun1被子类的覆盖。在Base类中的虚函数表的后边还存在D类中的虚函数fun3。
小结:
(1)派生类重写基类的虚函数,函数名,参数列表,返回值相同。但是协变例外。
(2)在父类中为虚函数,在子类中也为虚函数
(3)只有类的成员函数才能定义为虚函数
(4)静态成员函数不能定义为虚函数
(5)类外写成员函数,在声明处加virtual。
(6)构造函数不能定义为虚函数,最好不要将operator=定义为虚函数。
(7)不要在构造函数和析构函数中调用虚函数
(8)最好将父类析构函数定义为虚函数。(虽然父类和子类的构造函数名不同,但是由于编译器优化,子类的析构函数会覆盖父类的)
本文出自 “一起去看星星” 博客,转载请与作者联系!
标签:继承&多态
原文地址:http://10810429.blog.51cto.com/10800429/1761736