C++进阶——继承(1)(用法)

博客ID :LanFuRen
C系列专栏 : C语言重点部分 C语言注意点 C++基础 Linux 数据结构 C++注意点 今日好题 C++进阶

声明等级:黑色->蓝色->红色

欢迎新粉加入,会一直努力提供更优质的编程博客,希望大家三连支持一下啦

C++有三大特性------封装,继承,多态。今天我们来聊一聊继承。

1)继承概念

通俗地说,其实跟我们日常生活中说的继承家业中的继承是类似的,例如写出两个类,假定一个是父类,一个是子类,继承就是子类可以使用父类的成员变量,成员函数等。那我们可以意识到,其实这就是复用,父类的东西是子类都需要的,是子类们的共同点,那这时候我们又不想去再次书写重复的成员变量(函数),我们就复用呗,那就出现了继承这一用法。

2)用法

1.格式

首先,我们得知道继承书写的格式。继承其实是在子类中声明的,格式如:派生类 :继承方式 基类 或者 子类:继承方式 父类。

cpp 复制代码
class Person//父类
{
public:
	Person(int age = 1, string name = "peter")
	{
		_age = age;
		_name = name;
	}

	void Print()
	{
		cout << _age << " " << _name << endl;
	}
	//父类私有可以间接使用
protected:
	int _age;
	string _name;
	//const char* _name;
};

class Student : public Person//子类
{
public:
	void Print()
	{
		cout << _name;//这里就使用了Person类的_name成员变量
	}
protected:
	int _stuid;
};

我们来测试运行一下看看结果,很明显是继承了父类的成员变量_name

那我们来想一想,子类中的_name是跟父类的_name一样吗?

我们来修改一下子类构造函数的代码:

cpp 复制代码
class Student : public Person
{
public:
	void Print()
	{
		_name = "potter";
		cout << _name;
	}
protected:
	int _stuid;
};

再用原来的测试代码测试一下:

不难看出父类的_name还是peter,子类的则是potter。所以说我们父子类的对象是不同的,但是是继承关系。我们来改变代码看看成员函数是不是同一个:

cpp 复制代码
class Person
{
public:
	Person(int age = 1, string name = "peter")
	{
		_age = age;
		_name = name;
	}

	void Print()
	{
		cout << _age << " " << _name<<endl;
	}
	//父类私有可以间接使用
protected:
	int _age;
	string _name;
	//const char* _name;
};

class Student : public Person
{
public:
protected:
	int _stuid;
};

可以看出函数的地址都是一样的。

2.继承方式问题

不同的继承方式会导致子类是否能直接使用父类的成员变量(函数)。继承方式经过排列组合会有9种情况

我们不用死记硬背。首先,如果父类的成员变量声明在private下,不管子类的继承方式是任何三种,子类都是不可以直接访问父类的成员变量(可以间接通过访问限定符修饰来间接使用);其次,就是父类的成员变量的限定方式与子类的继承方式进行比大小了,我们选择取限定严格的即public>protected>private。那么,直接拿图说话:

这就是继承关系的判断。

3.基类和派生类对象赋值转换

我们直接提供一串代码来进行分析:

cpp 复制代码
int main()
{
    Student s;
	Person p;
	p = s;
	return 0; 
}
点击并拖拽以移动

其实赋值转换就是将子类对象赋值给父类对象,是因为子类的成员变量在父类对象中,不能将父类给子类,因为子类可能会有父类不存在的成员变量,这样父类就会出现多余不存在的成员变量出现错误。

本节我们就聊继承的这些,下一节我们聊继承的构造函数以及隐藏。

相关推荐
meiying883833 分钟前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
@大迁世界1 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust
SEO_juper1 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
学逆向的1 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
低调滴开发2 小时前
3 行代码写崩一个函数?切片才是 Rust 字符串处理的正确姿势
开发语言·后端·rust
CodeYp20192 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
猫猫.1532 小时前
HashTable、HashMap、ConcurrentHashMap 核心区别总结
java·开发语言·java-ee
pipixia200333 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
乌暮4 小时前
综合案例:宠物电商系统
java·开发语言·spring·mvc·restful·1024程序员节
大文说跨境4 小时前
亚马逊多店铺的图片素材怎么批量去重:EXIF 与哈希的处理流程
开发语言·php