C++的继承和派生(一)父类和派生类(子类)的介绍以及派生类的访问控制
在介绍继承和派生之前,先看下面一段代码
class Student1 {public:int m_socre;int m_age;void speak() {cout << "Student1-speak()" << endl;}
};class Student2 {public:int m_socre;int m_height;void speak() {cout << "Student2-speak()" << endl;}
};class Person {public:Student1 s1;Student2 s2;void speak() {cout << "Person-speak()" << endl;}
};int main() {Person person;person.s1.m_age = 10;cout << "Student1-age="<<person.s1.m_age << endl;person.speak();person.s1.speak();person.s2.speak();getchar();return 0;
}
运行结果
Student1-age=10
Person-speak()
Student1-speak()
Student2-speak()
说明
从上面的代码中可以看出,Student1 类和 Student2 类有公共的成员变量和成员函数,此时可以通过在Person类定义这两个类的的对象,从而来访问这些类的成员变量和函数(这里只是采用了嵌套)。这样写代码会觉得很繁琐,一旦当公共成员很多的时候就觉得很麻烦,此时C++提供了一种继承机制来解决这种问题
继承(父类和子类)
当多个类中公共的成员时,此时就可以将这些公共成员放在一个类中,我们将这个类称之为基类,而需要用到这个类中成员的类我们就称之为子类(派生类),子类中可以定义不同于父类的成员。它们之间的关系就成为继承。
特点
1、提高了代码的复用性
2、提高了代码的维护性
3、让类与类之间产生了关系,这是多态的前提格式
class 派生类名 :继承方式 基类名{派生类新增成员
};
此时上面的代码可以改写为
class Person {public:int m_socre;void speak() {cout << "Person-speak()" << endl;}
};class Student1 :public Person{public:int m_age;void speak() {cout << "Student1-speak()" << endl;}
};class Student2 :public Person {public:int m_height;void speak() {cout << "Student2-speak()" << endl;}
};int main() {Student1 s1;Student2 s2;s1.m_age = 10;s1.m_socre = 100;cout << s1.m_age<<" "<< s1.m_socre << endl;s1.speak();s2.m_height = 11;s2.m_socre = 101;cout << s2.m_height << " "<<s2.m_socre << endl;s2.speak();getchar();return 0;
}
派生类的访问控制
成员访问权限、继承方式有3种
1、public:公共的,任何地方都可以访问(struct默认)
2、protected:子类内部、当前类内部可以访问
3、private:私有的,只有当前类内部可以访问(class默认)用的最多的继承方式是public,这样能保留父类原来的成员访问权限
访问权限不影响对象的内存布局
总结:
1、所谓继承,就是把父类的所有成员复制到子类中而已,只不过private成员在子类中不能被调用和访问而已,但是还是会占用子类的对象的内存
2、要想毫无保留的使用基类成员,就将父类成员定义为public或者protected
3、也就是说,子类内部访问父类成员的权限,是成员本身的访问权限和上一级父类的继承方式中权限最小的那个权限
补充:
单继承下的内存模型
C++的继承和派生(一)父类和派生类(子类)的介绍以及派生类的访问控制相关推荐
- div不继承父类样式_Python编程思想(27):类的继承
-----------支持作者请转发本文-----------李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要 ...
- 在NHibernate的单表继承模式下通过父类Repository查询子类
在NHibernate中经常遇到继承与关系数据库的ORMapping的问题,我之前的一篇博客(http://www.cnblogs.com/studyzy/archive/2011/08/16/214 ...
- IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类
IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类 查看当前类所有的父类 查看当前所有的子类 查看当前类所有的父类 1.找到当前类所在的位置,右键选择Diagrams,然后选择 ...
- JAVA子类继承多个_Java的一个子类可以继承自多个父类。
Java的一个子类可以继承自多个父类. 答:× 放样时的路径允许有几个?() 答:1个 下列有关有限合伙企业设立条件的表述中,不符合新颁布的<合伙企业法>规定的是( ) 答:有限合伙企业名 ...
- java 实例方法直接调用超类的实例方法_Java继承关系中,父类方法使用实例变量和调用实例方法的探究...
面向对象编程中,某一个实例方法使用实例变量和调用其它实例方法的情况是常见的.当存在继承关系时,这种情况就变得复杂起来.以下就对继承关系中,父类的某实例方法使用实例变量和其它实例方法的情况进行探究.因为 ...
- java继承关系中,父类private修饰的内容真的不能被继承吗?NO
前情引入 关于java的继承,初学的时候,一直认为父类中private修饰的东西时无法被子类继承.后来随着学习的深入,见得多了一些,看到一些文章博客的另一种观点:其实父类中的东西,除了构造方法之外,其 ...
- 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)
27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...
- 父类指针可以指向子类对象
结论:父类指针可以指向子类对象,但是只能访问父类成员,不能访问子类成员 结论:子类指针不可以指向父类对象,需要类型转换才可以 笔记: <1>.当基类指针指向派生类的时候,只能操作派生类从基 ...
- 抽象类试验。定义一组具有继承关系的类。Shape(形状)类是一个抽象类,包含4个数据成员(坐标x,y,颜色c,图形对象g(Graphics类对象))
package Test5_1_zxj; import javax.swing.*; import java.awt.*; public abstract class Shape {// 抽象类试验. ...
最新文章
- 极限中0除以常数_高中物理必知的50个关键常数, 每个都是得分点!
- Python如何实现单步调试
- git常用基本简单命令
- 【Flask项目2】定制统一的JSON返回格式(6)
- nginx后端节点健康检查
- “Z世代”崛起,网易云信助力猫耳FM引领声音风潮
- 机器人加锤石如何放技能q_ADC必须会躲4个技能,前两个训练走位,能躲图4的只有闪现!...
- 【动态规划】 多米诺骨牌 (ssl 1632/luogu 1282)
- 训练时发生的错误:Couldn‘t open shared file mapping: <000001910A228862>, error code: <1455>
- pythongui做计算器_python GUI模拟实现计算器
- java(8) HashMap源码
- 论文精读——基于演化动力学的复杂网络中带阈值雪堆博弈模型研究
- 苹果iphone公交卡支持哪些城市(详细)
- 【支持MSP430G2553】MSP430+BSL烧写教程
- 【Python】正则表达式判断是否存在连续N个字母
- 计算机cpu intel,Intel的CPU后面带F是什么意思?
- 纵说“同步”与“异步”
- Python:实现floor向下取整算法(附完整源码)
- 提醒大家提高安全意识: 虎口脱险记
- ALevel 自由落体:历史与基本概念
热门文章
- 十进制转二进制函数实现(C语言)
- c 调试易语言dll,易语言制作调试助手
- java使用jsoup爬虫入门
- nodejs中解决发出响应数据正常但是浏览器没有正确显示的问题
- 用Ai(adobe illustrator)制作文字放射效果
- scada系统集成_设计 SCADA 应用程序软件
- sql查询每科成绩的最高分_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
- KaTex的一个简单例子
- ubuntu20.04 Server安装部署Janus
- 【消息中心】架构准备