继承
1、继承是面向对象三大特性之一。
2、下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候考虑利用继承的技术,减少重复的代码。
1、继承的基本语法
子类名:继承方式 父类名
其中:子类也称为派生类,父类也称为基类
//继承实现页面
//公共页面类
class Basepage {
public:
void header() {
cout << "首页、公开课、登录、注册...(公共头部)" << endl;
}
void footer() {
cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
}
void left() {
cout << "java、python、C++...(公共分类列表)" << endl;
}
};
//java页面
class Java :public Basepage {
public:
void content() {
cout << "Java学科视频" << endl;
}
};
//Python页面
class Python :public Basepage {
public:
void content() {
cout << "Python学科视频" << endl;
}
};
//C++页面
class Cpp :public Basepage {
public:
void content() {
cout << "C++学科视频" << endl;
}
};
//继承的好处:减少重复代码
//语法: class 子类:继承方式 父类
void test01() {
cout << "java下载视频页面如下:" << endl;
Java ja;
ja.header();
ja.footer();
ja.left();
ja.content();
cout << "-------------------------------" << endl;
cout << "python下载视频页面如下:" << endl;
Python py;
py.header();
py.footer();
py.left();
py.content();
cout << "-------------------------------" << endl;
cout << "c++下载视频页面如下:" << endl;
Cpp cpp;
cpp.header();
cpp.footer();
cpp.left();
cpp.content();
}
2、继承方式
继承方式有三种:
1、公共继承
2、保护继承
3、私有继承
3、继承中的对象模型
1、父类中所有非静态成员属性都会被子类继承下去
2、父类中私有成员属性是被编译器给隐藏了,因此访问不到,但确实又被继承了
利用开发人员命令提示工具查看对象模型步骤:
VS2017 开发人员
1、跳转盘符
2、跳转文件路径 cd具有路径
3、查看命名
4、c1 / d1 reportSingleClassLayou类名 文件名
4、继承中构造和析构顺序
顺序是:父类构造-》子类构造-》子类析构-》父类析构
5、继承同名成员处理方式
1、子类对象可以直接访问到子类中同名成员
2、子类对象加作用域可以访问到父类同名成员
3、当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
6、同名静态成员处理方法
同名静态成员处理方式和非静态处理方式一样,只不过有两种访问方式(通过对象和通过类名)
class Base {
public:
static int m_a;
static void func() {
cout << "Base- static function" << endl;
}
};
class Son : public Base{
public:
//静态成员 类内声明,类外初始化
static int m_a;
static void func() {
cout << "Son- static function" << endl;
}
};
int Base::m_a = 100;
int Son::m_a = 200;
//同名静态成员属性
void test01() {
//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;//第一个::代表通过类名访问,第二个::代表访问父类作用域下
}
//同名静态成员函数
void test02() {
//1、通过对象访问
Son s;
s.func();
s.Base::func();
//2、通过类名访问
Son::func();
Son::Base::func();
}
7、多继承语法
C++允许一个类继承多个类
语法:
class 子类:继承方式 父类1, 继承方式 父类2…
如果出现父亲们中有同名成员,通过子类访问时,要加作用域予以区分
8、菱形继承
菱形继承概念:
1、两个派生类继承同一个基类
2、又有某个类同时继承两个派生类
这种继承称为菱形继承,或者钻石继承
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 test01(){
SheepTuo st;
st.Sheep::m_age= 100;
st.Tuo::m_age= 200;
cout <<"st.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;
}
总结:
1、菱形继承带来的主要问题是:子类继承两份相同的数据,导致资源浪费且毫无意义
2、利用虚继承可以解决菱形继承问题