1.1继承机制是面向对象继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。这是网上的概念我的理解就是子类可以继承父类的功能,子类访问父类公开的属性,在其属性可以进行扩展。
如图:继承只能继承父类公开的属性,不能继承父类私有的

1.2继承关系
1.3继承访问的关系变化
个人理解总结,公有继承对于基类只要父类成员变量和成员函数是共有和保护的子类就能访问,保护继承是儿子可以继承父亲的属性,但是类外就不能访问。
切片
子类对象,子类指针,子类引用,可以赋值给父类
父类对象不能给子类
如图:

- 在继承体系中基类和派生类都有独立的作用域。
- 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,
也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)- 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
- 注意在实际中在继承体系里面最好不要定义同名的成员。
如图:

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子
类,都只有一个static成员实例 。
class person {
public:
static int a;
int b;
private:
int c;
};
int person::a = 2;
class son:public person{
public:
void person() {
cout<<person::b;
}
int d;
};
int main() {
son s;
person p;
s.a++;
s.a++;
cout<<s.a<<endl;
cout << p.a;
}

我来举个例子就是父类是人,子类是教师,教授继承人,孙子类继承教授和教师,若父类有一个a,
子类会有a,孙子类也会有父类的a,爷爷类的a,这样会导致数据冗余和二义性,导致a会被放2份。
class Person
{
public:
string _name; // 姓名
};
class teacher : public Person
{
protected:
int _num; //学号
};
class professor : public Person
{
protected:
int _id; // 职工编号
};
class Assistant : public teacher, public professor
{
protected:
string _majorCourse; // 主修课程
};
void Test()
{
// 这样会有二义性无法明确知道访问的是哪一个
Assistant n;
n._name = "peter";
// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决
n.professor::_name = "xxx";
n.teacher::_name = "yyy";
}

虚继承解决菱形继承的问题
在教师和教授继承前加个virtual,即可解决
原理就是运用虚基表里面的虚基质指针来通过指向位置的首地址加偏移量可以找到2个量。