C++第十五次课笔记——继承

继承

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、利用虚继承可以解决菱形继承问题

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值