c++中的继承--1(引出,继承方式,继承的对象模型)

继承的引出

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

  1. 网页 有很多公共部分

  2. 导致实现时候有很多重复的代码

  3. 引出继承,基类(父类)公共网页

  4. 具体子类(派生类),实现不同的内容

  5. 语法 class 子类 :继承方式 父类

     #include<iostream>using namespace std;//class News//{//public://	void header()//	{//		cout << "公共的头部" << endl;//	}////	void footer()//	{//		cout << "公共底部" << endl;//	}//	void left()//	{//		cout << "左侧列表" << endl;//	}//	void content()//	{//		cout << "新闻播报:白百合.." << endl;//	}//};//class Yule//{//public://	void header()//	{//		cout << "公共的头部" << endl;//	}////	void footer()//	{//		cout << "公共底部" << endl;//	}//	void left()//	{//		cout << "左侧列表" << endl;//	}//	void content()//	{//		cout << "新闻播报:白百合.." << endl;//	}//};/*void test01(){//新闻类News news;news.header();news.footer();news.left();news.content();//娱乐类Yule y1;y1.header();y1.footer();y1.left();y1.content();}*///继承写法//抽象一个 基类的网页 重复的代码都写到这个网页上class BasePage{public:void header(){cout << "公共的头部" << endl;}void footer(){cout << "公共底部" << endl;}void left(){cout << "左侧列表" << endl;}void content(){cout << "新闻播报:白百合.." << endl;}};class News :public BasePage //继承  News类继承 BasePage类{public:void content(){cout << "新闻播报" << endl;}};class YULE :public BasePage{public:void content(){cout << "白百合.." << endl;}};class Game :public BasePage{public:void content(){cout << "kpl直播" << endl;}};void test02(){cout << "新闻网页内容:" << endl;News news;news.header();news.footer();news.left();news.content();cout << "娱乐网页内容:" << endl;YULE y1;y1.header();y1.footer();y1.left();y1.content();cout << "游戏网页内容:" << endl;Game y2;y2.header();y2.footer();y2.left();y2.content();}//继承  减少代码重复内容//BasePage 基类 (父类)  News 派生类 (子类)int main(){test02();system("pause");return 0;}
    

继承的方式

在这里插入图片描述

  1. 不管公有继承 ,保护,还是私有,基类中的私有属性,都不可以继承下去
  2. 公有继承 父类中的protected在子类中是protected,父类中的public在子类中还是public
  3. 保护继承,父类中的protected在子类中是protected,父类中的public在子类中是protected
  4. 私有继承,父类中的protected在子类中是private,父类中的public在子类中是prviate

注意:

  1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是 被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。

  2. . 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能 访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。

  3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类 的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。

  4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的 写出继承方式。

  5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用 protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中 扩展维护性不强。

    #include<iostream>
    using namespace std;class Base1
    {
    public:int m_A;
    protected:int m_B;
    private:int m_C;};//公有继承
    class Son1 : public Base1
    {
    public:void func(){//cout << m_C << endl;//基类中私有属性 不可继承cout << m_A << endl; //基类中公有属性可继承还是publiccout << m_B << endl;//基类中保护属性 可继承 还是protected}
    };void testSon1()
    {Son1 s1;s1.m_A;//s1.m_B; 类外访问不了protected属性
    }//--------------------------保护继承-------------class Base2
    {
    public:int m_A;
    protected:int m_B;
    private:int m_C;};class Son2 :protected Base2
    {
    public:void func(){//cout << m_C << endl;//基类中私有属性 不可继承cout << m_A << endl; //基类中公有属性可继承还是protectedcout << m_B << endl;//基类中保护属性 可继承 还是protected}
    };
    void func2()
    {Son2 s;//s.m_A;//保护继承类外不可访问}
    //--------------------------私有继承-------------
    class Base3
    {
    public:int m_A;
    protected:int m_B;
    private:int m_C;
    };class Son3 :private Base3
    {
    public:void func(){//cout << m_C << endl;//基类中私有属性 不可访问cout << m_A << endl;//基类中公有属性 可继承 还是private}
    };class GrandSon3 :public Son3
    {
    public:void myFunc(){;//cout << m_A << endl;//孙子类中 访问不到m_A,因为在Son3中m_A已经是私有属性了}
    };int main()
    {system("pause");return 0;}
    

继承中的对象模型

  1. 子类中会继承父类中所有的内容,包括了私有属性

  2. 只是我们访问不到,编译器给隐藏了

     #include<iostream>using namespace std;class Base{public:int m_A;protected:int m_B;private:int m_C;};//子类中 会继承父类的私有成员 只是被编译器给隐藏起来,访问不到私有成员class Son :public Base{public:int m_D;};void test01(){cout << sizeof(Son) << endl;//大小为16,基类中的私有成员也在子类中被继承,只是无权访问}int main(){test01();system("pause");return 0;}
    

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

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

相关文章

c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)

多态的基本概念 多态是面向对象设计语言数据抽象和继承之外的第三个基本特征多态性(polymorphism)提供接口与具体实现之间的另一层隔膜&#xff0c;从而将“what”和“how”分离开来&#xff0c;多态性改善了代码的可读和组织性&#xff0c;同时也使创建的程序具有可扩展性&am…

Ubuntu下各种服务搭建及操作技巧

Ubuntu下搭建TFTP 1、安装软件包 sudo apt-get install tftpd tftp xinetd 2、建立配置文件 在/etc/xinetd.d/下建立一个配置文件tftp sudo vi /etc/xinetd.d/tftp 内容如下 service tftp { socket_type dgram protocol udp wait yes user root …

使用Automake和Autoconf生成Makefile

automake 所产生的 Makefile 除了可以做到程序的自动编译和链接 外&#xff0c;还可以用来生成各种文档&#xff08;如manual page、info文件&#xff09;&#xff0c;可以将源代码文件包装起来以供发布。所以程序源代码所存放的目录 结构最好符合GNU的标准惯例。下面以hello.…

c++中多态---3(虚析构和纯虚析构,向上类型转化和向下类型转化)

虚析构和纯虚析构 虚析构virtual ~类名(){}类内声明&#xff0c;类内实现解决问题&#xff1a;通过父类指针指向子类对象释放时候不干净的问题 纯虚析构 写法 virtual ~类名(){}0; 类内声明 类外实现 如果出现了纯虚析构函数&#xff0c;这个类也算是抽象类&#xff0c;不可…

嵌入式开发硬件知识札记

三态逻辑 1. 概念 三态指其输出既可以是一般二值逻辑电路&#xff0c;即正常的高电平&#xff08;逻辑1&#xff09;或低电平&#xff08;逻辑0&#xff09;&#xff0c;又可以保持特有的高阻抗状态。高阻态相当于隔断状态&#xff08;电阻很大&#xff0c;相当于开路&#xff…

《凡人修仙传》中打斗场景(c++多态实现)

我们 要实现打斗场景&#xff0c;第一&#xff0c;我们需要有打斗的双方&#xff0c;一个是英雄&#xff0c;一个是怪物&#xff0c;他们都有自己的属性&#xff0c;比如攻击&#xff0c;防御&#xff0c;血量。其次我们的英雄还会有武器。武器上有一些加成属性&#xff0c;可以…

c++中的文件读写的操作

写文件 ofstreamopen指定打开方式isopen判断是否打开成功ifs<<“数据”ofs.close&#xff08;&#xff09; 读文件 ifstream ifs 指定打开方式ios::in isopen判断是否打开成功 读取有三种方式 #include<iostream>using namespace std;//文件读写头文件#incl…

c++的STL--1概念通述

STL的概念 什么是STL? STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架。 STL从广义上分为&#xff1a;容器(container)&#xff0c;算法(algorit…

c++的vector容器

vector容器概念 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它…

新一代数据库技术

新一代非关系型数据库有以下5个主要类型&#xff1a; 面向文件存储&#xff1a;适用于存储海量文件&#xff0c;代表产品MongoDb 列存储(wide column store/column-family)数据库&#xff1a;快速查找相关数据&#xff0c;相关数据被放在同一列中&#xff0c;代表产品Cassandra…

c++中stack容器

Stack 简介 stack 是堆栈容器&#xff0c;是一种“先进后出”的容器。stack 是简单地装饰 deque 容器而成为另外的一种容器。#include stack没有迭代器 Stack所有元素的进出都必须符合“先进后出”的条件&#xff0c;只有stack顶端的元素&#xff0c;才有机会被外界取用&am…

c++中的queue容器

queue容器 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端 提取元素。 队列作为容器适配器实现&#xff0c;容器适配器即将特定容器类封装作为其底层容器类&#xff0c;queue提供一组特定的 成员…

c++中list容器

list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。list与for…

c++中容器(STL)的共性与使用的时机

容器的共通能力 C模板是容器的概念 理论提高&#xff1a;所有容器提供的都是值&#xff08;value&#xff09;语意&#xff0c;而非引用&#xff08;reference&#xff09;语意。容器执 行插入元素的操作时&#xff0c;内部实施拷贝动作。所以 STL 容器内存储的元素必须能够被…

Qt Creator 窗体控件自适应窗口大小布局

常见的软件窗口大小改变&#xff08;最大化、手动改变时&#xff09;需要窗口的部件能够自适应布局&#xff0c;而在Qt的应用程序界面设计中&#xff0c;对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。网上百度了很多&#xff0c;多数说的很含糊&#xff0c;还…

QT子线程与主线程的信号槽通信

最近用QT做一个服务器&#xff0c;众所周知&#xff0c;QT的主线程必须保持畅通&#xff0c;才能刷新UI。所以&#xff0c;网络通信端采用新开线程的方式。在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦。网上提供了很多同一线程不同类间采用信号槽通信的方式&#xff0c;…

c++中的函数适配器

函数适配器 函数适配器概念 STL中定义了大量的函数对象&#xff0c;但是有时候需要对函数返回值进行进一步的简单计算&#xff0c;或者填上多余的参数&#xff0c;不能直接代入算法&#xff0c;函数适配器实现了这一功能&#xff0c;将一种函数对象转化为另一种符合要求的函数…

c++中STL实现演讲比赛流程

演讲比赛流程 1&#xff09;某市举行一场演讲比赛&#xff0c;共有 24 个人参加&#xff0c;按参加顺序设置参赛号。比赛共三轮&#xff0c;前两 轮为淘汰赛&#xff0c;第三轮为决赛。 2&#xff09;比赛方式&#xff1a;分组比赛 第一轮分为 4 个小组&#xff0c;根据参赛号…

c++实现贪吃蛇

游戏中的实现元素 游戏中元素分为&#xff1a;墙壁&#xff0c;蛇&#xff0c;事物以及蛇的可行区域和右侧的版本号和游戏玩法提示 墙壁 *号表示&#xff0c;代表一个区域范围&#xff0c;也就是蛇的可移动区域&#xff0c;蛇如果碰到墙壁视为死亡&#xff0c; 蛇 分为蛇头&a…