C++基础13-类和对象之继承1

C++可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。

总结:

1、只要是父类中的private成员,不管是什么继承方式,儿子都访问不了,但它是存在在儿子之中
2、如果是公有(public)继承, 儿子中的访问控制权限保持不变。
3、如果是保护(protected)继承, 儿子中父亲中除了private成员,其余在儿子中都是protected
4、如果是私有(private)继承, 儿子中的父亲的除了private成员,其余在二中都是private成员。
5、查看能否调用的//三看原则:  
                    (1) 看调用的成员变量是在类的内部还是类的外部
                    (2) 看儿子继承方式,
                    (3) 当前变量在儿子中的变量在父亲中的访问控制权限
6、构造方法和析构方法不继承

5.1 类和类之间的关系

has-Auses-A is-A

has-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类

uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现

is-A 机制称为“继承”。关系具有传递性,不具有对称性。

5.2继承

类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类 的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。

派生类的组成:

派生类中的成员,包含两大部分,一类是从基类继承过来的,一类是自己增加的成员。从基类继承过过来的表现其共性,而新增的成员体现了其个性。

几点说明:

1,全盘接收,除了构造器与析构器。基类有可能会造成派生类的成员冗余,所以说基类是需设计的。

2,派生类有了自己的个性,使派生类有了意义。

5.3、 继承的⽅式

5.3.1 语法

class 派⽣类名:[继承⽅式] 基类名 {

派⽣类成员声明;

};

一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类, 称为单继承。

protected 对于外界访问属性来说,等同于私有,但可以派生类中可见

public继承:

当类的继承方式为公有继承时,基类的公有和保护成员的访问属性在派生类中不变,而基类的私有成员不可访问即基类的公有成员和保护成员被继承到派生类 中仍作为派生类的公有成员和保护成员。派生类的其他成员可以直接访问它们。无论派生类的成员还是派生类的对象都无法访问基类的私有成员。

protected继承:

保护继承中,基类的公有成员和私有成员都以保护成员的身份出现在派生类 中,而基类的私有成员不可访问派生类的其他成员可以直接访问从基类继承来的 公有和保护成员,但是类外部通过派生类的对象无法访问它们,无论派生类的成员 还是派生类的对象,都无法访问基类的私有成员。

private继承:

当类的继承方式为私有继承时,基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可访问基类的公有 成员和保 护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接 访问它们,但 是在类外部通过派生类的对象无法访问。无论是派生类的成员还是通过派生类的对 象,都无法访问从基类继承的私有成员。通过多次私有继承后,对于基类的成员都 会成为不可访问。因此私有继承比较少用。

private成员在子类中依然存在,但是却无法访问到。不论何种方式继承基类,派生类都不能直接使用基类的私有成员 。

如何恰当使用public,protected,private继承方式:

1、需要被外界访问的成员直接设置为public

2、只能在当前类中访问的成员设置为private

3、只能在当前类和子类中访问的成员设置为protected(protected成员的访问权限介于public和private之间。 )

1类和类之间的关系

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class A
{
public:void func() {cout << "funcA" << endl;}int a;
};//类B拥有类A的成员变量, B has A ,//类B 依赖于 类A  依赖度高
class B
{
public:void funcB() {}A a;
};
//耦合度  高内聚 低耦合//类C 的成员方法  需要类A的形参, C use A,//类C 依赖于 类A
class C
{
public:void funcC(A *a) {}void funcC2(){}
};//D继承与A    类D 如果是继承类A  类 D  is  A 。//类D继承与A 耦合度很高
class D :public A
{
public:void funcD() {cout << this->a << endl;}};class E :public D
{
};
int main(void)
{return 0;
}

2继承的基本概念

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>using namespace std;class Student
{
public:Student(){}Student(int id, string name){this->id = id;this->name = name;}void printS() {cout << "id = " << this->id << ", name = " << this->name << endl;}int id;
private:string name;
};//创建一个新的学生类,增加score、功能
class Student2
{
public:Student2(int id, string name, int score){this->id = id;this->name = name;this->score = score;}void printS() {cout << "id = " << this->id << ", name = " << this->name << endl;cout << "score = " << this->score << endl;}
private:int id;string name;//addint score;
};//通过继承创建一个新的学生类
class Student3 :public Student
{
public://Student3(int id, string name, int score) //{//	this->id = id;//	this->name = name;  //无法访问父类的私有成员//	this->score = score;//}Student3(int id, string name, int score) :Student(id, name)  //利用父类的构造方法进行初始化部分数据成员{this->score = score;}void printS() {Student::printS();cout << "score = " << this->score << endl;}
private:int score;
};int main(void)
{Student3 s3(1, "zhang3", 80);s3.printS();return 0;
}
#endif

3继承的方式

#if 1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory>using namespace std;//规则1,  只要是父类中的private成员,不管是什么继承方式,儿子都访问不了
//规则2,  如果是公有(public)继承, 儿子中的访问控制权限保持不变。
//规则3,  如果是保护(protected)继承, 儿子中父亲中除了private成员,其余在儿子中都是protected
//规则4,  如果是私有(private)继承, 儿子中的父亲的除了private成员,其余在二中都是private成员。class Parent
{
public:int pub; //在类的内部 和 外部 都能访问。
protected:int pro; //在类的内部可以访问, 在类的外部不可以访问
private:int pri;  //在类的内部可以访问, 在类的外部不可以访问
};//公有继承
class Child :public Parent
{
public:void func(){cout << pub << endl; //pub父类的public成员变量,在public继承 类的 【内部 外部】可以访问。
cout << pro << endl;//pro 是父类protected成员变量 在public继承类的 【内部】可以访问。外部访问不了 //此时的pro在孙子能够访问,说此时pro不是private成员,而是protected成员//cout << pri << endl; //pri 是父类private成员变量 在public继承类的 【内部,外部】[不]可以访问。}};//孙子类
class SubChild : public Child
{void sub_func(){cout << pro << endl;}
};//保护继承
class Child2 :protected Parent
{
public:void func2() {pub;//此时pub通过protected继承 能够在类的内部访问。 //pub 在类的内部可以访问, 类的外部访问不了, 类的儿子可以访问//pub 就是protected成员pro;//pro 根pub 是一样的性质,pro也是protected成员//pri;}
};class Sub_child2 :public Child2
{
public:void sub_func2() {pub;pro;}
};//私有继承
class Child3 :private Parent
{
public:void func3(){pub;//pub 在类的内部可以访问。在类的内部可以访问,类的外部不能访问。//pub 在儿子中访问不了,说明pub在Child3中是 私有成员pro;//pro 根pub的性质是一样, 也是私有成员。//pri;}
};class Sub_Child3 :public Child3
{
public:void sub_fun3(){//pub;//pro;}
};//三看原则:  
//1 看调用的成员变量是在类的内部还是类的外部
//2 看儿子继承方式,
//3 当前变量在儿子中的变量在父亲中的访问控制权限int main(void)
{Child c1;c1.func();c1.pub;//c1.pri;Child2 c2;//c2.pub;//c2.pro;Child3 c3;//c3.pub;//c3.pro;c1.pub;return 0;
}
#endif

4继承方式的练习

#if 0
#include<iostream>
using namespace	std;
class	A
{
private:int	a;
protected:int	b;
public:int	c;A(){a = 0;b = 0;c = 0;}void	set(int	a, int	b, int	c){this->a = a;this->b = b;this->c = c;}
};class	B : public	A
{
public:void	print(){//cout << "a	=	" << a;		//a是父类的私有成员访问不了cout << "b	=	" << b;		//b 此时是保护成员,类的内部可以访问cout << "c	=	" << c << endl;	//c 此时是公有成员,类的内部可以访问}
};class	C : protected	A
{
public:void	print(){//cout << "a	=	" << a;		//a是父类的私有成员访问不了cout << "b	=	" << b;		//b 在子类中是protected权限,类的内部可以访问。cout << "c	=	" << c << endl;	 //c 子类的protected成员,类的内部可以访问。}
};class	D : private	A
{
public:void	print(){//cout << "a	=	" << a;		//a是父类的私有成员访问不了cout << "b	=	" << b << endl;	//b 此时是private成员,类的内部可以访问。cout << "c	=	" << c << endl;	//c 此时是private成员,类的内部可以访问。}
};int	main(void)
{A	aa;B	bb;C	cc;D	dd;aa.c = 100;			 //c 是公有 ,类的外部可以访问。bb.c = 100;			 //Bpublic 继承与A ,保持权限不变,c 是公有, 类的外部可以访问//cc.c = 100;	
//C protected 继承与A, c 在此类中是protected成员,类的外部不能访问。
//dd.c = 100;	//D private 继承与A, c在此类中private成员,类的外部不能访问。aa.set(1, 2, 3);		//set在父类中是公有权限,类外能访问bb.set(10, 20, 30);		//set是public继承,在子类中是public权限,在类外能访问//cc.set(40, 50, 60);	//set是protected继承,set在子类中是保护权限 类外不能否访问//dd.set(70, 80, 90);	//set是private继承,set在子类中是私有权限 类外不能否访问bb.print();	 //print 是定义在B类 public成员函数,在类的外部可以访问。cc.print();	//print 是定义在C类 public成员函数,在类的外部可以访问。dd.print();	//print 是定义在D类 public成员函数,在类的外部可以访问。return 0;
}
#endif

 

 

 

 

 

 

 

 

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

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

相关文章

C++基础13-类和对象之继承2

总结&#xff1a; 1、子类对象可以当做父类对象使用 2、子类对象可以直接赋值给父类对象 3、子类对象能够直接初始化父类对象 4、父类指针可以直接指向子类对象 5、凡是继承过来的属性和函数都可以在子类中用this-> 进行访问 6、默认构造函数并不会初始化数据成员 7、如果…

C++基础14-类和对象之多继承与虚继承

多继承&#xff1a;一个类有多个直接基类的继承关系称为多继承 总结&#xff1a; 1、一般将具有菱形样式继承方式的某些类声明为虚继承 3、虚继承的主要目的是为了防止二义性 2、虚继承就是在继承方式前加virtual 如果一个派生类从多个基类派生&#xff0c;而这些基类又有一…

linux系统安装ntp,CentOS下NTP安装配置

安装yum install ntp配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 default kod nomodify notrap nopeer noqueryrestrict 127.0.0.1restrict -6 ::1# 用restrict控管权限# nomodify - 用户端不能更改ntp服务器的时间参数# noquery - …

C++基础15-类和对象之多态

总结&#xff1a; 1、在父类中申明虚函数时&#xff0c;一般情况下在子类中也申明&#xff08;便于读代码&#xff09; 一、赋值兼容 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。 赋值兼容是一种默认行为,不需要任何的显示的转化步骤。 …

傲云浏览器linux,Centos7安装部署zabbix监控软件

目录部署监控服务器部署监控服务器Zabbix ServerWeb页面验证设置部署监控服务器一、安装LNMP环境Zabbix监控管理控制台需要通过Web页面展示出来&#xff0c;并且还需要使用MySQL来存储数据&#xff0c;因此需要先为Zabbix准备基础LNMP环境。1. wget下载官网Nginxwget http://ng…

c语言环境变量的作用,C语言获取系统环境变量

C语言获取系统环境变量可以通过如下代码实现.#include #include char *platform(){//获取系统变量信息char *ret;extern char **environ;char **env environ;//打印系统变量信息/*while(*env){//puts(*env);env;}*/ret getenv("OS"); //for windows_ntif(NULL ! re…

mysql索引创建及使用注意事项

总结&#xff1a; 1、在使用索引时&#xff0c;一般情况下不建议使用like操作。如果使用&#xff0c;则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.&#xff08;最左缀原则&#xff09; 2、单列索引的使用&#xff1a; 《1》 只…

mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...

[闽南网]和平精英公测开启&#xff0c;和平精英与刺激战场有什么不同呢&#xff1f;今天小编就为大家带来了信号值详解&#xff01;各位玩家千万不要错过呀&#xff01;信号值详解信号接收区和信号值是什么&#xff0c;对选手有什么影响&#xff1f;在游戏战斗界面中&#xff0…

制备pdms膜的方法_船体用钢板基底超疏水表面的制备和性能

鲨鱼皮具有神奇的微纳双层结构&#xff0c;其微米级肋条状结构在水中的整流效果可减小水的阻力。纳米级刺状突起或刚毛具有疏水特性&#xff0c;使植物抱子很难附着其上&#xff0c;海藻等植物也不能在其表面生长&#xff3b;1,2&#xff3d;。这种微纳结构及其疏水性的共同作用…

递归题型解析

#include<iostream> using namespace std; int foo(int n) {if (n < 1)return n;return (foo(n - 1) foo(n - 2)); } int main() {printf("%d\n", foo(5));return 0; } 解析&#xff1a; foo(5)foo(4)f00(3)foo(3)foo(2)foo(3)2foo(3)foo(2)2(foo(2)foo(1…

64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...

简介最近学习了一下_IO_FILE的利用&#xff0c;刚好在pwnable.tw上碰到一道相关的题目。拿来做了一下&#xff0c;遇到了一些困难&#xff0c;不过顺利解决了&#xff0c;顺便读了一波相关源码&#xff0c;对_IO_FILE有了更深的理解。文章分为三部分&#xff0c;分别是利用原理…

戴尔笔记本电脑开机黑屏怎么办_戴尔笔记本电脑充不进电怎么办

笔记本电脑电池充不进电要怎么办呢&#xff1f;笔记本电脑之所以这么受欢迎&#xff0c;是因为笔记本有配备电池&#xff0c;能够在没有电源的情况下使用五六个小时。而电池的电用光后&#xff0c;就需要进行充电。不过有些用户反映说&#xff0c;自己的电池充不进电&#xff0…

IIS安装2个SSL_顶级域名0元撸-免费注册2个腾讯云域名 免费SSL证书

前言这两天折腾甜糖CDN&#xff0c;为了收益最大化申请了公网IP&#xff0c;于是顺带折腾了一下群晖外网访问。使用的DDNS方案是腾讯dnspod&#xff0c;注册一个便宜的顶级域名访问我的群晖&#xff0c;折腾过程中发现可以免费注册2个顶级域名&#xff0c;不敢独享发出来大家一…

三菱a系列motion软体_工控电缆如何制作?(以三菱PLC、触摸屏为例)

RS232接口的三菱Q系列PLC编程通讯电缆三菱GT11/GT15触摸屏RS232串口编程电缆三菱GT11/GT15触摸屏连接Q系列PLC电缆三菱GT11/GT15触摸屏连接FX2/FX2C/A/QnA系列PLC电缆三菱GT11/GT15 触摸屏连接FX3U/FX2N/FX1N系列PLC电缆FX2、A系列PLC到A970GOT人机介面连接电缆FX0s/FX0n/FX2n/…

电脑入门完全自学手册_「新书推荐」新能源汽车维修完全自学手册

《新能源汽车维修完全自学手册》作者&#xff1a;广州瑞佩尔信息科技有限公司 、胡欢贵售价&#xff1a;85.00上市时间&#xff1a;2020年7月本书内容分为 8 章, 第 1 章为高压安全系统, 主要介绍了新能源汽车中高压安全防护装置构造以及维修所需的安全防护工具、 安全作业规范…

C/C++混淆点-左移右移操作符

对一个数实行左移或者右移操作&#xff0c;即先把操作数转换为二进制&#xff0c;然后左移&#xff08;>>&#xff09;即从左到右开始舍弃&#xff0c;右移&#xff08;<<&#xff09;即从各位之后开始加0。最后再转换为十进制。 #include<iostream> using…

ar路由器 pppoe下发ipv6 dns_IPv6网络设置各种疑难杂症诊疗区

1、Windows电脑系统IPv6无网络访问权限怎么解决&#xff1f;Win7系统下连接IPv6无网络访问权限的解决方法&#xff08;1&#xff09;首先修复网络连接&#xff0c;Win XP操作系统的网络连接有“修复”选项&#xff0c;Win7没有&#xff0c;不过可以使用“诊断”选项&#xff0c…

c语言判断化学方程式,下列是某同学写的六个化学方程式:①Mg+O2点燃.MgO2②C+O2点燃.CO...

化学方程式是最重要的化学语言&#xff0c;正确、熟练地书写化学方程式是学习化学必需具备的重要基本功。怎样书写化学方程式?1.要遵循两个基本原则(1)以客观事实为基础化学方程式既然是化学反应的表达形式&#xff0c;显然&#xff0c;有某一反应存在&#xff0c;才能用化学方…

tensorboard ckpt pb 模型的输出节点_“技术需求”与“技术成果”项目之间关联度计算模型 TOP10 baseline...

竞赛网址&#xff1a;传送门线上分数&#xff1a;0.78490746000&#xff0c;目前可以进入前10参考了苏神的代码&#xff0c;非常感谢&#xff1a;传送门调参技巧&#xff1a;传送门中文bert权重&#xff1a;传送门#! -*- coding:utf-8 -*-

白盒测试六种方法案例分析

1、语句覆盖 2、判定覆盖 3、条件覆盖 4、判定/条件覆盖 5、组合覆盖 6、路径覆盖