c++的继承与虚继承

来源:互联网 发布:淘宝苹果组装机 编辑:程序博客网 时间:2024/04/30 10:38

继承与虚继承

在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。

图解:




1 0