4_继承

继承

什么是继承

struct Person
{
    int age;
    int sex;
};

struct Teacher
{
    int age;
    int sex;
    int level;
    int classid;
};

struct Teacher:Person
{
    int level;
    int classid;
}

观察 Person 和 Teacher 两个结构体, 发现里面有两个成员是重复的, 那么我能不能不写这个重复的代码

当然可以, 语法就是冒号后面跟上你要重写的那个结构体名字

struct Person
{
    int age;
    int sex;
};

struct Teacher
{
    int level;
    int classid;
};

struct Teacher:Person // 继承
{
    int level;
    int classid;
}

一个结构体继承了另一个结构体之后, 大小会变大, 是继承以后的大小

如果仅仅只看反汇编代码的话, 你可以感受到这是个大的结构体而不是一个小的结构体继承了另一个结构体, 这种感觉.

这个就是编译器帮我们做的事情.

总结 :

  1. 什么是继承 ?

    继承就是数据的复制

  2. 为什么要用继承 ?
    减少重复代码的编写

  3. Person 称为父类或者基类

  4. Teacher 称为子类或者派生类

C++ 这些新的语法, 无外乎就是让我们写更少的代码, 或者让我们写更简单的代码

struct Person
{
    int age;
    int sex;
};

struct Teacher
{
    int age;    //与Person 重复
    int sex;    //与 Person 重复
    int level;
    int classid;
};

struct Teacher:Person
{
    int level;
    int classid;
}

现在, Person 和 Teacher 中有两个重复成员, 如果这个时候 Teacher 继承 Person 会怎样 ?

观察内存结构得知, 子类里的成员和父类里的成员完全一样的时候, 你在使用的时候, 如果不特别说明, 编译器会认为你要使用的是子类的成员. 如果你像 t.Person::age = 1; 这样来使用父类的成员.

我们应该尽量避免这种情况, 因为它有点麻烦.

继承不仅仅局限于父类

struct X
{
    int a;
    int b;
};
struct Y:X
{
    int c;
    int d;
};
struct Z:Y  // Z 的成员只继承 c d 吗 ?
{
    int e;
    int f;
};

观察内存结构, Z 不光继承了 Y, 还继承了 X, 如果只看反汇编代码, 还是那句话, 看不出来这个是继承的痕迹.

多重继承

struct X
{
    int a;
    int b;
};
struct Y
{
    int c;
    int d;
};
struct Z:X,Y    // 多重继承
{
    int e;
    int f;
}

多重继承和刚才的继承不太一样, 刚才的继承可以理解为多层次的继承, 而多重继承就是直接把继承很多个, 多重继承也叫多继承, 这在很多面向对象的编程语言中 (比如 java) 是不允许使用的.

多重继承增加了程序的复杂程度, 不建议使用