C++之继承

目录

一、继承的关系

二、继承方式和子类权限

三、子类构造函数

 四、继承的种类


一、继承的关系

继承一定要的关系:子类是父类   学生是人   狗是动物

继承的实现形式:

class 子类名:继承方式 父类名

{

        成员变量:

        成员函数:

} ;

二、继承方式和子类权限

继承方式:public protected private

父类

继承方式

子类

Public

Public

Public(类内类外都可以访问)

Protected

Protected(类内可以访问)

Private

不可访问

#include<iostream>
using namespace std;
/****************父类********************/
class Base
{
public:int c;
private:char a;
protected:int b;
};
/****************子类继承父类********************/
class Inherit:public Base       //继承方式:public
{
public:void test(){b = 10;                //父类protected,类内可以访问c = 16;                //父类public,类内类外都可以访问int e;}
private:int d;};int main()
{Inherit inherit1;cout<<sizeof(inherit1) <<endl;inherit1.c = 15;           //父类public,类内类外都可以访问return 0;
}

父类

继承方式

子类

Public

Protected

Protected(类内可以访问)

Protected

Protected(类内可以访问)

Private

不可访问

#include<iostream>
using namespace std;
/****************父类********************/
class Base
{
public:int c;
private:char a;
protected:int b;
};
/****************子类继承父类********************/
class Inherit :protected Base       //继承方式:protected
{
public:void test(){b = 10;                    //父类protected,类内可以访问c = 16;                    //父类public,类内可以访问int e;}
private:int d;};int main()
{Inherit inherit1;cout << sizeof(inherit1) << endl;return 0;
}

父类

继承方式

子类

Public

Private

Private(类内可以访问)

Protected

Private(类内可以访问)

Private

不可访问

#include<iostream>
using namespace std;
/****************父类********************/
class Base
{
public:int c;
private:char a;
protected:int b;
};
/****************子类继承父类********************/
class Inherit :private Base       //继承方式:private
{
public:void test(){b = 10;                  //父类protected,类内可以访问c = 16;                  //父类public,类内可以访问int e;}
private:int d;
};int main()
{Inherit inherit1;cout << sizeof(inherit1) << endl;return 0;
}

规律:

  • 继承关系中,不论是哪种继承关系,只要是父类的private的,子类都是不可访问的;
  • 继承之后,子类的权限跟继承方式有关,跟父类的权限无关; 
  • 如果只衍生一代,private和pritected的继承方式类似,子类都只能在类内访问;
    如果衍生两代的话,继承方式private只能衍生一代,protected可以继续衍生
#include<iostream>
using namespace std;
/****************父类********************/
class Base
{
public:int c;
private:char a;
protected:int b;
};
/****************子类继承父类********************/
class Inherit :private Base       //继承方式:private
{
public:void test(){b = 10;                //父类protected,类内可以访问c = 16;                //父类public,类内可以访问}
private:int d;
};
/****************子子类继承子类********************/
class AA:public Inherit//由于子类继承方式是private,所以子子类无法再继承
{
void test1()
{}
public:int e;
private:int f;
protected:int g;
};int main()
{Inherit inherit1;cout << sizeof(inherit1) << endl;return 0;
}

三、子类构造函数

子类实例化对象:父类构造  子类构造

子类对象生命周期结束:子类析构  父类析构

 1、Person.h

#ifndef _PERSON_H_
#define _PERSON_H_#include<iostream>
using namespace std;
#include<string>
class Person
{
public:Person();Person(string _name);Person(string _name,int _age,string _sex="女");~Person();void eat();void sleep();
protected:string name;int age;string sex;
};
#endif

2、Person.cpp

 每个函数名前需要加上类的作用域

#include "Person.h"Person::Person()
{cout << "Person()" << endl;
}
Person::Person(string _name):name(_name)
{cout << "Person(string)" << endl;
}
Person::Person(string _name, int _age, string _sex):name(_name),age(_age),sex(_sex)
{cout << "Person(string,int,string)" << endl;
}
Person::~Person()
{cout << "~Person()" << endl;
}
void Person::eat()
{cout << name << "去吃饭了" << endl;
}
void Person::sleep()
{cout << name << "去睡觉了" << endl;
}

3、Worker.h

#pragma once
#include "Person.h"
class Worker :public Person
{
public:Worker();Worker(string _name);Worker(string _name,int _age,string _sex,int _salary);void work();void show();~Worker();
protected:int salary;};

4、Worker.cpp

#include "Worker.h"Worker::Worker()
{cout << "Worker()" << endl;
}
Worker::Worker(string _name):Person(_name)
{cout << "Worker(string)" << endl;
}
void Worker::work()
{cout <<name<< "在工作" << endl;
}Worker::Worker(string _name, int _age, string _sex, int _salary):Person(_name,_age,_sex),salary(_salary)
{cout << "Worker(string,int,string,int)" << endl;
}
void Worker::show()
{cout << "name="<<name << endl;cout << "age=" << age << endl;cout << "sex=" << sex << endl;cout << "salary=" << salary << endl;
}Worker::~Worker()
{cout << "~Worker()"  << endl;
}

 5、main.cpp

#include"Worker.h"
#include <iostream>
using namespace std;int main()
{Worker worker("Liy",12,"男",17222);worker.show();return 0;
}

运行结果:

 四、继承的种类

1、多层继承

特点:从父类到子类越来越具体,最终实例化的时候只需要实例化子类的最后一个对象即可

1、Person.h

#ifndef _PERSON_H_
#define _PERSON_H_#include<iostream>
using namespace std;
#include<string>
class Person
{
public:Person();Person(string _name);Person(string _name,int _age,string _sex="女");~Person();void eat();void sleep();void setName(string _name);void setAge(int _age);void setSex(string _age);
protected:string name;int age;string sex;
};
#endif

2、Worker.h

#pragma once
#include "Person.h"
class Worker :public Person
{
public:Worker();Worker(string _name);Worker(string _name,int _age,string _sex,int _salary);void work();void show();~Worker();void setSalary(int _salary);
protected:int salary;};

 3、Programmer.h

#pragma once
#include "Worker.h"
class Programmer : public Worker
{
public:Programmer();Programmer(string _name,string _level);void coding();~Programmer();void setLevel(string _level);protected:string level;
};

 4、Person.cpp

#include "Person.h"Person::Person()
{cout << "Person()" << endl;
}
Person::Person(string _name):name(_name)
{cout << "Person(string)" << endl;
}
Person::Person(string _name, int _age, string _sex):name(_name),age(_age),sex(_sex)
{cout << "Person(string,int,string)" << endl;
}
Person::~Person()
{cout << "~Person()" << endl;
}
void Person::eat()
{cout << name << "去吃饭了" << endl;
}
void Person::sleep()
{cout << name << "去睡觉了" << endl;
}
void Person::setName(string _name)
{}
void Person::setAge(int _age)
{}
void Person::setSex(string _age)
{}

 5、Worker.cpp

#include "Worker.h"Worker::Worker()
{cout << "Worker()" << endl;
}
Worker::Worker(string _name):Person(_name)
{cout << "Worker(string)" << endl;
}
void Worker::work()
{cout <<name<< "在工作" << endl;
}Worker::Worker(string _name, int _age, string _sex, int _salary):Person(_name,_age,_sex),salary(_salary)
{cout << "Worker(string,int,string,int)" << endl;
}
void Worker::show()
{cout << "name="<<name << endl;cout << "age=" << age << endl;cout << "sex=" << sex << endl;cout << "salary=" << salary << endl;
}Worker::~Worker()
{cout << "~Worker()"  << endl;
}void Worker::setSalary(int _salary)
{}

6、 Programmer.cpp

#include "Programmer.h"
Programmer::Programmer()
{cout << "Programmer()" << endl; 
}
Programmer::Programmer(string _name, string _level):Worker(_name),level(_level)
{cout << "Programmer(string,string)" << endl;
}
void Programmer::coding()
{cout <<level<< "工程师" << name<<"在敲代码"<<endl;
}
Programmer::~Programmer()
{cout << "~Programmer()" << endl;
}void Programmer::setLevel(string _level)
{}

2、多重继承(菱形继承)

图片举例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/275662.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DHCP中继实验(思科)

华为设备参考&#xff1a;DHCP中继实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 DHCP中继&#xff0c;可以实现在不同子网和物理网段之间处理和转发DHCP信息的功能。如果DHCP客户机与DHCP服务器在同一个物理网段&#xff0c;则客户机可以正确地获得动态分配的IP…

Redis实现分布式锁源码分析

为什么使用分布式锁 单机环境并发时&#xff0c;使用synchronized或lock接口可以保证线程安全&#xff0c;但它们是jvm层面的锁&#xff0c;分布式环境并发时&#xff0c;100个并发的线程可能来自10个服务节点&#xff0c;那就是跨jvm了。 简单分布式锁实现 SETNX 格式&…

如何在Windows系统安装Node.js环境并制作html页面发布公网远程访问?

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

VScode(Python)使用ssh远程开发(Linux系统树莓派)时,配置falke8和yapf总结避坑!最详细,一步到位!

写在前面&#xff1a;在Windows系统下使用VScode时可以很舒服的使用flake8和yapf&#xff0c;但是在ssh远程开发树莓派时&#xff0c;我却用不了&#xff0c;总是出现问题。当时我就开始了漫长的探索求知之路。中间也请教过许多大佬&#xff0c;但是他们就讲“能用不就行了&…

【Redis】Redis常用命令一

1.keys&#xff1a;返回所有满足条件的key&#xff0c;比如&#xff1a; KEYS pattern时间复杂度&#xff1a;O(N)&#xff0c;返回值&#xff1a;匹配pattern的所有key。 • h?llo 匹配 hello , hallo 和 hxllo • h*llo 匹配 hllo 和 heeeello • h[ae]llo 匹配 hello 和 …

C语言游戏实战(4):人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

Pytest测试中的临时目录与文件管理!

在Pytest测试框架中&#xff0c;使用临时目录与文件是一种有效的测试管理方式&#xff0c;它能够确保测试的独立性和可重复性。在本文中&#xff0c;我们将深入探讨如何在Pytest中利用临时目录与文件进行测试&#xff0c;并通过案例演示实际应用。 为什么需要临时目录与文件&a…

【李沐论文精读】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…

「金三银四」,你遇到过哪些奇葩题目?参与出题可领取腾讯新春定制祥龙公仔哦!

「金三银四」&#xff0c;是职场人在每年春季最忙的时期之一。在这个时期&#xff0c;各大企业都会举行各种各样的面试和笔试&#xff0c;而这些面试中出现的题目往往千奇百怪&#xff0c;有时候甚至让人捧腹大笑 &#xff01; 为此&#xff0c;腾讯云开发者社区预计推出以「金…

【C++基础】3.第一个C++程序“Hello world!”——《跟老吕学C++编程语言》

【C基础】3.第一个C程序——《跟老吕学C编程语言》 第一个C程序“Hello world&#xff01;”1.创建新项目2.选择“控制台程序”3.命名存储4.输入代码5.编译运行 第二个C程序“你好&#xff0c;世界&#xff01;”1.输入代码2.编译运行 C语言跟C语言的区别1.结构不同2.设计不同3…

Linux常用操作命令

Linux常用操作命令 1.文件管理catfile 2.文档编辑3.文件传输4.磁盘管理5.磁盘维护6.网络通讯7.系统管理8.系统设置9.备份压缩10.设备管理 Linux 英文解释为 Linux is not Unix。 Linux内核最初只是由芬兰人李纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上…

OpenCV读取tensorflow神经网络模型:SavedModel格式转为frozen graph的方法

本文介绍基于Python的tensorflow库&#xff0c;将tensorflow与keras训练好的SavedModel格式神经网络模型转换为frozen graph格式&#xff0c;从而可以用OpenCV库在C 等其他语言中将其打开的方法。 如果我们需要训练并使用一个神经网络模型&#xff0c;一般情况下都是首先借助Py…

react 综合题-旧版

一、组件基础 1. React 事件机制 javascript 复制代码<div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&a…

利用Java实现数据矩阵的可视化

1. 引言 在进行工程开发时&#xff0c;通常需要在窗口的某个区域将有效数据形象化地呈现出来&#xff0c;例如&#xff1a;对于某一区域的高程数据以伪色彩的方式呈现出高度的变化&#xff0c;这就需要解决利用Java进行数据呈现的问题。本文将建立新工程开始&#xff0c;逐步地…

UDP数据报套接字编程

1.1UDP编程原理 对于UDP协议来说&#xff0c;具有无连接&#xff0c;面向数据报的特征&#xff0c;即每次都是没有建立连接&#xff0c;并且一次发送全部数据报&#xff0c;一次接收全部的数据报。Java中使用UDP协议通信&#xff0c;主要基于DatagramSocket类来发送或接收数据报…

NBlog整合OSS图库

NBlog部署维护流程记录&#xff08;持续更新&#xff09;&#xff1a;https://blog.csdn.net/qq_43349112/article/details/136129806 由于项目是fork的&#xff0c;所以我本身并不清楚哪里使用了图床&#xff0c;因此下面就是我熟悉项目期间边做边调整的。 目前已经调整的功能…

Docker容器Docker桌面配置镜像加速

打开Docker Desktop应用程序&#xff0c;点击设置 具体配置如下&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"features": {"buil…

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程&#xff1a;1.前端用户提交用户名&#xff0c;密码 2. 序列化器校验用户名&#xff0c;密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

Electron程序如何在MacOS下获取相册访问权限

1.通过entitiment.plist&#xff0c;在electron-builder签名打包时&#xff0c;给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证&#xff0c;若出现这个&#xff0c;则说明成…