1.继承
继承是面向对象三大特性之一
有些类与类之间存在特殊的关系

继承的好处: 减少重复代码
语法: class 子类: 继承方式 父类
子类也称为派生类 父类也称为基类
class Python : public BasePage {
public :
void Content() {
}
};
2.继承方式
继承方式一共有三种:
公共继承
保护继承
私有继承

父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了
3.继承中构造和析构顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
问题: 父类和子类的构造和析构顺序是谁先谁后?
先构造父类,再构造子类,析构的顺序与构造的顺序相反
4.继承同名成员处理方式
问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
访问子类同名成员直接访问即可
访问父类同名成员需要加作用域
class base {
public :
int m_A;
base() {
m_A = 100;
}
void func() {
cout << "base的调用" << endl;
}
void func(int num) {
cout << "base的重载"<<num <<endl;
}
};
class bnn : public base {
public:
int m_A;
bnn() {
m_A = 120;
}
void func() {
cout << "bnn的调用" << endl;
}
};
void test012() {
bnn b;
cout << " ban下m_A " << b.m_A << endl;
//如果通过子类对象访问到父类中同名成员,需要加作用域
cout << " base下m_A " << b.base::m_A << endl;
b.func();//直接调用调用是子类中的同名成员
//如何调用到父类中同名成员函数?
b.base::func();
//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
//如果想访问到父类中被隐藏的同名成员函数,需要加作用域
b.base::func(110);
}
5.继承同名静态成员处理方式
问题: 继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方式一致
访问子类同名成员直接访问即可
访问父类同名成员需要加作用域
class Base {
public :
static int m_A;
static void func() {
cout << "Base static void func() " << endl;
}
static void func(int) {
cout << "Base static void func() " << endl;
}
};
int Base::m_A = 120;//类外初始化
class Son : public Base
{
public :
static int m_A;
static void func() {
cout << "Son static void func() " << endl;
}
};
int Son::m_A = 23;//类外初始化
//同名静态成员函数
void test013() {
//1.通过对象访问
cout << "通过对象访问: " << endl;
Son s;
cout << "son下的m_A =" << s.m_A << endl;
cout << "Base下的m_A =" << s.Base::m_A << endl;
//2.通过类名访问
cout << "通过类名访问: " << endl;
cout << "son下的m_A =" << Son::m_A << endl;
//第一个::代表通过类名方式访问 第二个::代表访问父类作用域下
cout << "Base下的m_A =" << Son::Base::m_A << endl;
//1.通过对象访问
s.func();
s.Base::func();
//2.通过类名访问
Son::func();
Son::Base::func();
// 子类出现和父类同名静态成员函数,也会隐藏父类中所有同名成员函数
// 如果想访问父类中被隐藏同名成员,需要加作用域
Son::Base::func(100);
}
6.多继承语法
C++允许一个类继承多个类
语法: class 子类∶ 继承方式 父类1,继承方式 父类2 --
多继承中如果父类中出现了同名情况,子类使用时候要加作用域
C++实际开发中不建议用多继承
class Son : public Base , private bnn
{
};
7.菱形继承
菱形继承概念;
两个派生类继承同一个基类
又有某个类同时继承者两个派生类
这种继承被称为菱形继承,或者钻石继承

//动物类
class Animal
{
public :
int m_Age;
};
//利用虚继承 解决 菱形继承的问题
//继承之前加上关键字 virtual 变为虚继承
// Animal类称为虚基类
//羊类
class Sheep :virtual public Animal{};
//驼类
class Tuo : virtual public Animal{};
//羊驼类
class SheepTuo : public Sheep, public Tuo {
};
void test123() {
SheepTuo st;
st.Sheep::m_Age = 18;
st.Tuo::m_Age = 38;
// 当菱形继承,两个父类拥有相同数据,需要加以作用域区分
cout << "st.Sheep: :m_Age = " << st.Sheep:: m_Age << endl;
cout << "st.Tuo : :m_Age = " << st.Tuo::m_Age << endl;
cout << "st.m_Age = " << st.m_Age << endl;
//这份数据我们知道只有有一份就可以,菱形继承导致数据有两份,资源浪费
}
本质:继承两个指针,两个指针指向偏移量
