C++ 类的继承与派生

news/2024/10/30 13:36:08/

目录

1、继承的概念

2、继承(Inherit)

3、继承方式

4、父子同名成员并存

5、虚函数(virtual)

6、纯虚函数


1、继承的概念

以李白为例

类1是类2的基类(父类),类2是类3的基类(父类)

2、继承(Inherit)

为了实现代码复用

看例子

#include <iostream>
using namespace std;class A {
public:int nA;A() {nA = 1;}void funcA() {cout << "funcA\n";  // \n和endl一样,都是换行}
};class B : public A {    //B公有继承A
public:int nB;B() {nB = 2;}void funcB() {cout << "funcB\n";}
};int main() {B b;b.funcA();  //调用继承得来的方法(父类中的函数)b.funcB();  //调用自己的方法cout << b.nA <<endl;  //调用继承得来的属性cout << b.nB;  //调用自己的属性return 0;
}

B公有继承A

对象B中既有继承得来的属性和方法,也有自己专属的属性和方法

输出结果:

3、继承方式

决定父类成员在子类中的访问控制属性

继承方式也分为:public(公有继承),protected(保护继承),private(私有继承)

父类的private成员不会被子类继承(也有一种说法是可以被子类继承,但不能直接访问)

(爸爸肯定想珍藏一些东西不想给儿子得到...或者说不能直接让儿子得到哈哈哈)

 

4、父子同名成员并存

class Father {
public:int n = 1;void func() {cout << "This is Father";}
};class Son : public Father {
public:int n = 2;void func() {cout << "This is Son";}void set() {n = -2;Father::n = -1;}
};int main() {Son son;son.func();  //直接用默认指子类的cout << endl;son.Father::func();  //用父类名字空间显示指明,则使用的是父类成员cout << endl;son.set();cout << son.n << endl;cout << son.Father::n;return 0;
}

子类中同时两个n和两个func(),一个继承父类的一个自己的

如果我们直接使用,默认是指子类成员

若需要使用父类成员,需用父类名字空间显示指明

运行结果:

 

5、虚函数(virtual)

关键字virtual加在函数名前

父类的虚函数可以在子类中被重写(override) ,即重新实现,但参数和返回值必须保持一致。

·含有虚函数的类叫做虚类

#include <iostream>
using namespace std;class Human {
public:virtual void say() {cout << "I'm human";}
};class Student : public Human {
public:void say() {cout << "I'm a student";  //重写父类的虚函数say()}
};int main() {Student student;student.say();
}

从输出结果我们可以看出,父类的虚函数say()已经被子类重写

6、纯虚函数

不实现,仅声明为纯虚函数,留待子类里重写定义

含有纯虚函数的类叫抽象类,仅有纯虚函数的类叫接口

抽象类和接口不可实例化

#include <iostream>
using namespace std;class Shape {  //只声明这是一个图形
public:virtual float getS() = 0;  //图形就可以求面积,但是不知道是什么图形,所以这里声明为纯虚函数,即让函数等于0
};class Circle : public Shape {  //在子类里重写父类的纯虚函数,定义它是一个圆
private:float radius;
public:Circle(float radius) {this -> radius = radius;}float getS() { return 3.14 * radius * radius; }  //对圆求面积
};int main() {Circle c(1.2);cout << c.getS() << endl;return 0;
}

 

 OK,至此我们已经介绍完了类的三大特性:封装、继承、派生

后面我们会继续介绍类的最后一个特性----多态

创作不易,希望大家可以多多支持,各位的点赞收藏关注就是我持续创作的动力!

写博客不仅是我个人学习和成长的见证,也真心希望这些内容能对大家有所帮助。


http://www.ppmy.cn/news/62599.html

相关文章

港科夜闻|广东省委常委、副省长王曦到访香港科技大学

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、广东省委常委、副省长王曦到访香港科技大学。在香港科大校长、粤港澳大湾区院士联盟理事会主席叶玉如教授陪同下&#xff0c;王曦常委率代表团参观国家级科研设施和了解学校发展情况&#xff0c;并与在港中国科学院院士座…

使用 Mercury 直接从 Jupyter 构建 Web 程序

动动发财的小手&#xff0c;点个赞吧&#xff01; 有效的沟通在所有数据驱动的项目中都至关重要。数据专业人员通常需要将他们的发现和见解传达给利益相关者&#xff0c;包括业务领导、技术团队和其他数据科学家。 虽然传达数据见解的传统方法&#xff08;如 PowerPoint 演示文…

【Linux】Keepalived+Haproxy实现数据库集群负载均衡

1、简介&#xff1a; 本文章的负载均衡和高可用是体现在两个从服务器上的。一般来说高可用是用在主服务器中的&#xff0c;例如双主多从的结构&#xff0c;双主做keepalived的高可用&#xff08;当然也可以加上haproxy做负载均衡&#xff09;&#xff0c;多从做haproxy的负载均…

Java企业级信息系统02—利用组件注解符精简spring配置文件

文章目录 一、学习目标二、打开01的项目三、利用组件注解符精简spring配置文件&#xff08;一&#xff09;创建新包&#xff0c;复制四个类&#xff08;二&#xff09;修改杀龙任务类&#xff08;三&#xff09;修改救美任务类&#xff08;四&#xff09;修改勇敢骑士类&#x…

设计模式 -- 备忘录模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

MySQL基础(二十四)索引的数据结构

1 为什么使用索引 顺序查询和数据使用二叉树结构再进行查询,如图&#xff1a; 2 索引及其优缺点 2.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 **索引的本质&#xff1a;**索引是数据结构。你…

人员管理KPI和OKR

文章目录 人员管理KPI和PI一、关键绩效指标概述&#xff08;一&#xff09;关键绩效指标的内涵&#xff08;二&#xff09;关键绩效指标的类型&#xff08;三&#xff09;基于关键绩效指标的绩效指标体系 二、关键绩效指标库三、指标权重与员工责任 OKR360 环评3P汇报法 人员管…

【MySQL】MySQL 知识点总结

文章目录 前言关系型数据库和非关系型数据库关系型数据库非关系型数据库关系型数据库与非关系型数据库之间的区别 MySQL整体架构SQL 的执行步骤MySQL 的架构图示连接器分析优化和执行查询缓存分析器优化器&执行器 存储引擎MyISAM和InnoDB的区别 事务事务的四大特性隔离级别…