继承与虚继承
在c++中继承是一重要特征,是面向对象复用的重要手段,通过继承建立一个类,共享公有的东西,再实现各自不同的属性。继承是类之间的关系模型。
1、实现一个简单的继承关系:
2、成员访问限定符&继承关系:
三种成员访问限定符:(1)public 共有,(2)protected 保护,(3)private 私有
三种继承关系:(1)public 共有继承,(2)protected 保护继承,(3)private 私有继承
3、三种继承关系基类成员在派生类中的访问关系变化:
4、赋值兼容规则(public继承)
(1)子类对象可以赋值给父类对象(切片原则)。
(2)父类对象不可以赋值给子类对象。
(3)父类的指针或引用可以指向子类对象。
(4)子类的指针或引用不可以指向父类对象(可以通过强制类型转换完成,但有可能访问非法空间)。
5、派生类默认合成的六个成员函数:
如果派生类没有显示定义一下成员函数,编译系统则会默认合成这六个默认成员函数。
(1)构造函数,(2)拷贝构造函数,(3)析构函数
(4)赋值操作符重载,(5)取地址操作符重载,(6)const 修饰的取地址操作符重载
6、单继承和多继承:
单继承:一个子类只有一个直接父类的继承关系称为单继承。
多继承:一个子类有两个或两个以上直接父类的继承关系称为多继承。
7、菱形继承:
菱形继承示例源代码:
class Person
{
public :
string _name ; // 姓名
};
class Student : public Person
{
protected :
int _num ; //学号
};
class Teacher : public Person
{
protected :
int _id ; // 职⼯编号
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ; // 主修课程
};
void Test ()
{
// 显⽰指定访问哪个⽗类的成员
Assistant a ;
a.Student ::_name = "xxx";
a.Teacher ::_name = "yyy";
}
菱形继承对象模型:
菱形继承的对象模型中存了两份Person。
菱形继承存在的问题:二义性和数据冗余。
解决方法:
(1)、显示指定访问哪个父类的成员。
(2)、虚继承。
8、虚继承
虚继承的作用:解决菱形继承的二义性问题。
菱形虚继承的对象模型:
图中的虚继承在VS编译器的环境下使用的是偏移量,在上图中直接使用指针指向虚基类是为了更直观的理解。
虚继承如何使用:只需在菱形继承中继承基类的子类继承方式前加virtual。
图解: