1.基本语法
class 子类名 : 继承方式 基类A,继承方式 基类B......
{
};
2.继承方式
public - 类外可以访问 子类可以访问
private - 类外不能访问 子类不能访问
protected - 类外不能访问 子类可以访问
3.继承规则
3.1 对象模型
子类占用内存的大小=子类变量占用的内存+基类变量占用的内存(无论子类是否可以访问基类变量 都占用内存)
3.2 构造/析构顺序
先构造基类 再构造子类 析构按照栈先入先出的原则
3.3 继承同名成员处理方式
对于子类同名成员 可以直接进行访问
对于父类的同名成员 需要添加作用域进行访问
对于多继承中的同名同源 也需要添加作用域进行访问
class test1 : public test2
{
public:
int m_a;
};
class test1 : public test2
{
public:
int m_a;
};
test1 t;
//访问子类t.m_a;
//访问基类t.test2::m_a
//函数访问同理
如果子类中出现和基类同名的成员函数,子类的同名成员会隐藏掉基类中所有同名成员函数
(基类函数重载后也不能直接进行访问)
3.4 菱形继承
3.4.1 概念
两个派生类继承了同一个基类 或者某个类同时继承了两个派生类
这种继承被称为菱形(钻石)继承
3.4.2 产生问题
1.A B同时继承了N的数据 当C使用时 会产生二义性
2.A B继承来的数据是重复的 浪费内存空间
3.4.3 解决方案
利用虚继承解决菱形继承问题
//在产生菱形继承前 将两个派生类的继承添加关键子 virtual 使其变为虚继承
//此时 将N类称为虚基类
class A : virtual public N;
class B : virtual public N;