IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的继承方式 -> 正文阅读

[C++知识库]C++中的继承方式

继承的概念

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

//父类/基类
class Person
{
public:
	void Print()
	{
		cout << "name:" << _name << endl;
		cout << "age:" << _age << endl;
	}
protected:
	string _name = "peter";
	int _age = 18;
private:
	int _aa;
};

//子类/派生类
//继承后父类的Person成员(成员函数+成员变量)都会变成子类的一部分
//student :派生类
//public:继承方法
//Person:基类
class Student :public Person
{
public:
	void func()
	{
		//_aa = 1;
		_age = 10;
		Print();
	}
protected:
	int _stuid;
};
int main()
{
	Student s;
	s.func();
	s.Print();

	return 0;
}

在这里插入图片描述
如上结果可以看到继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student复用了Person的成员。运行结果可以看出,在Student中可以调用Person中的函数,并且定义出的Student的对象中也可以直接使用Print函数。

继承定义

上面那段代码中,可以看到Student是Person的子类,继承的定义格式如下:
其中Student是子类的类名,public是继承方式,Person是父类也可以叫做基类。

class Student :public Person

继承方式和访问限定符

上面在定义子类继承的时候用到了public来修饰,实际上他和类里面的访问限定符一样,也可也使用protected和private。如下所示:
在这里插入图片描述
这里不同继承方式的子类,会继承父类里面不同访问限定符中的内容。
在这里插入图片描述
上面表格可以归结为如下几点:

  1. 基类的私有成员在子类中无论是以什么形式继承都是不可见的,这里的不可见的意思是虽然基类的私有成员还是继承到子类中,但是在语法上子类对象不管在类里面还是类外面都不能去访问这些私有成员
  2. 基类的私有对象在派生类中是不能被访问的,但是如果想做到成员不能在类外面被访问,但是可以在子类里面被访问,那可以使用访问限定符protected修饰,可以看出protected这个限定符主要可以用在继承上面。
  3. 上面的访问内容总的可以发现,除了基类的私有对象在任何子类中都不可见,基类的其他成员在子类的访问方式为成员在基类的访问限定符和子类的继承方式两者取其中权限更小的,权限大小顺序为public>protected>private
  4. 定义C++的类和结构体,C++的类是从结构体基础上发展来的,因此他们存在一定的区别,例如C++的类默认的访问限定符是private,结构体则是public,在继承方式上面也是一样类默认的继承方式是private,结构体则是public,但是一般在定义子类的继承时,最好显式的写出来。
  5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

测试代码如下:

//父类/基类
class Person
{
public:
	void Print()
	{
		cout << "name:" << _name << endl;
		cout << "age:" << _age << endl;
	}
protected:
	string _name = "peter";
	int _age = 18;
private:
	int _aa;
};
class Student :public Person
{
public:
	void func()
	{
		_age = 10;
		Print();
	}
protected:
	int _stuid;
};

class Student1:protected Person
{
public:
	void func()
	{
		_age = 10;
		Print();
	}
protected:
	int _stuid;
};

class Student2 :private Person
{
public:
	void func()
	{
		_age = 10;
		Print();
	}
protected:
	int _stuid;
};
int main()
{
	Student s;
	s.func();
	s.Print();
	Student1 s1;
	s1.func();
	//s1.Print();
	Student2 s2;
	s2.func();
	//s2.Print();

	return 0;
}

上面的结构可以看到,protected和private继承方式继承来的内容可以在类里面使用,但是在类外面无法使用,即s1和s2定义出来的对象无法直接调用父类中的Print函数

切片

派生类对象可以赋值给基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。需要注意的是基类对象不能赋值给派生类对象,代码如下:

//赋值兼容规则(切割或者切片)
class Person
{
protected:
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};
class Student : public Person
{
public:
	int _No; // 学号
};

int main()
{
	Person p;
	Student s;
	//将子类赋值给父类,父类=子类赋值兼容,切割/切片,仅限于公有继承
	//这里不存在类型转换,是语法天然支持的行为
	//类型转换会中间产生临时变量
	//保护或者私有继承方式可能会存在权限的转换,因此不能赋值兼容
	p = s;
	//父类不能赋值给子类
	// 但是指针和引用可以经过强制类型转换进行,但是存在越界风险
	//s = p;
	Student* ptr = (Student*)&p;
	Student& ref = (Student&)p;
	Person* ptr = &s;
	Person& ref = s;
	return 0;
}

上面切片的代码可以形象的认为进行了如下的过程,子类中的内容比父类中多,将原本父类中的内容赋值给一个父类对象,可以形象的认为是将子类切片的过程。父类对象的指针或者引用实际上也可以赋值给子类的指针和引用,需要进行强制类型转换,但是这种做法可能会引起越界的风险。
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:00:54  更:2022-05-07 11:01:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 1:28:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码