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.hqwc.cn/news/536282.html

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

相关文章

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

从汇编来角度剖析C语言函数调用过程

目录 1.引言 2.寄存器 3.栈帧 4.函数调用前调用者的动作 5.被调用者在函数调用后的动作 6.被调用者返回前的动作 7.调用者在返回后的动作 8.总结 1.引言 当一个c函数被调用时&#xff0c;一个栈帧(stack frame)是如何被建立&#xff0c;又如何被消除的。这些细节跟操作…

代码随想录算法训练营Day46 ||leetCode 139.单词拆分 || 322. 零钱兑换 || 279.完全平方数

139.单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() 1, false);dp[0] true;for (int i 1; i < s.size(); …

霹雳学习笔记——6.1.2 ResNeXt

相比于ResNet&#xff0c;更新了block 效果&#xff1a;错误率低于ResNet&#xff0c;并且计算量一样。 对比卷积和组卷积&#xff0c;参数个数会变成1/g倍&#xff0c;g是分成了g组 最终输出的channel与卷积核的个数相同。 &#xff08;好像是。。。好像之前听过这个&#xff…

分布式搜索引擎elasticsearch(2)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;[Domain Specific Language](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html)&#xff09;来定义查…

Linux CentOS系统安装Spug并结合内网穿透实现远程访问本地运维平台

目录 前言 1. Docker安装Spug 2 . 本地访问测试 3. Linux 安装cpolar 4. 配置Spug公网访问地址 5. 公网远程访问Spug管理界面 6. 固定Spug公网地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux CentOS系统安装Spug并结合…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes&#xff0c;将调用缓存的数据&#xff0c;速度比较快result_type:[json,xml,serialize,var_export]返回数据格式&#xff0c;默认为jsonl…

算法---双指针练习-1(移动零)

移动零 1. 题目解析2. 讲解算法原理数组划分&#xff0c;数组分块&#xff08;核心思想&#xff09;如何做到 3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 数组划分&#xff0c;数组分块&#xff08;核心思想&#xff09; dest一般初始化为-1&#x…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

实用指南!2024年度计划怎么写?工作学习必备!

在新的一年开始之际&#xff0c;制定一份详细而实用的年度计划对于实现个人和职业目标至关重要。无论是在工作、学习还是生活中&#xff0c;一个明确的计划可以帮助你更好地组织时间、资源和精力&#xff0c;从而更有效地实现目标。下面是一个关于如何写年度计划的指南&#xf…

食药物质创新 赋能中式滋补健康产业发展交流会圆满结束

3月5日&#xff0c;“食药物质创新 赋能中式滋补健康产业发展交流会”在山东国际会展中心召开。本次会议由中国生物发酵产业协会主办&#xff0c;浙江科技大学、未名太研生物科技(绍兴)有限公司承办&#xff0c;汇乐达供应链服务(常州)有限责任公司支持。本次论坛旨在加强行业创…

详解MySQL的MVCC(ReadView部分解析C++源码)

文章目录 1. 什么是MVCC2. MVCC核心组成&#xff08;三大件&#xff09;2.1 MVCC为什么需要三大件 3. 隐藏字段4. undo log4.1 模拟版本链数据形成过程 5. Read View5.1 m_ids5.2 m_creator_trx_id5.3 m_low_limit_id5.4 m_up_limit_id5.5 可见性分析算法 6. MVCC流程模拟6.1 R…