C++语言类之间的关系
在c++中通过类定义对象,而类与类之间也有着复杂的关系,所以题外话,我能理解到c++的编写者可能就想通过计算机语言去模拟世界万物之间的关系,这篇帖子主要从横向和纵向去讨论类之间关系
而在一个类中想要使用另一个类中的内容,无非三种方式,1.直接传参 2.传地址 3.在一个类中去定义另一个类
从横向来看,可以分为1.依赖 2.关联 3.聚合 4.复合,接下来用UML类图展示一下这几种横向关系
第一种,依赖,一个对象的一个功能需要依赖另一个对象存在,被依赖的对象作为工具使用, 在上图的例子中,CComputer 这个类对于CPerson来说,是作为Coding的一个工具,CComputer不是CPerson的一个特性,所以是依赖关系
第二种,关联,就类似于朋友之间的平等关系,关联的特点是随时建立,随时解除,利用指针去指向CFriend的地址
第三种,聚合,相当于强版本的关联,但聚合的目的是为了统一进行管理同类型的对象,就像是一个家庭,或者是一个班级,所以一般这里的对象都需要new出来的, 在聚合的析构里可以统一删除,统一创建
第四种,复合,又叫组合,是属于CPerson的一部分,类似于脑袋,双手
之所以建立这种类之间的关系,也是根据c++的单一性这个特点,每一个部分都是一个独立的个体,一个类的修改不会影响到其他的部分,也可以进行任意组合,下面是针对这个类图的代码
#include <iostream>
#include <time.h>
using namespace std; class CHead
{
public:
void Say()
{
cout << "张个大嘴,哇啦哇啦" << endl;
}
}; class CHand
{
public:
void Move()
{
cout << "比比划划" << endl;
}
}; class CComputer
{
public:
void Coding()
{
cout << "C++ Coding....." << endl;
}
}; class CFriend
{
public:
int rp;
public:
CFriend()
{
rp = rand()%;
}
public:
void Play()
{
cout << "哈哈哈哈哈哈" << endl;
}
}; class CPerson
{
public:
CHead head; // 组合
CHand hand;
CFriend* m_pFriend; // 关联一个朋友
public:
CPerson()
{
m_pFriend = ;
}
public:
void FindFriend(CFriend* pFriend)
{
if(pFriend == )
return; if(pFriend->rp > )
{
m_pFriend = pFriend;
}
}
void ChickenDinner()
{
if(m_pFriend == )
{
cout << "~~~~(>_<)~~~~玩的不开心" << endl;
}
else
{
m_pFriend->Play();
}
}
void Say()
{
head.Say();
hand.Move();
}
void Coding(CComputer& cm) // 依赖一个电脑
{
head.Say();
cm.Coding();
}
}; class CFamily
{
public:
CPerson* pArr[]; // 聚合到 家庭中
public:
CFamily()
{
for(int i=;i<;i++)
pArr[i] = ;
}
~CFamily()
{
for(int i=;i<;i++)
{
if(pArr[i] != )
{
delete pArr[i];
pArr[i] = ;
}
}
}
public:
void PushPerson(CPerson* ps)
{
if(ps == )
return;
for(int i=;i<;i++)
{
if(pArr[i] == )
{
pArr[i] = ps;
return;
}
}
}
void AllPersonCoding(CComputer& cm)
{
for(int i=;i<;i++)
{
if(pArr[i] != )
{
pArr[i]->Coding(cm);
}
}
}
}; int main()
{ //srand((unsigned int)time(0)); //CComputer cm;
//CFriend ff; //CPerson ps;
//ps.Say();
//ps.Coding(cm); //ps.FindFriend(&ff);
//ps.ChickenDinner(); //--------------------------------------------------
CPerson* ps1 = new CPerson;
CPerson* ps2 = new CPerson;
CPerson* ps3 = new CPerson; CComputer cm;
CFamily fm;
fm.PushPerson(ps1);
fm.PushPerson(ps2);
fm.PushPerson(ps3);
fm.AllPersonCoding(cm); system("pause");
return ;
}
而从纵向关系来看的关系有1.继承 2.多态
首先来说继承,继承中分为基类(父类),派生类(子类),继承的优点就是,提高代码的复用性,在派生类中,基类的所有成员都可以使用,而具体能否使用就得看继承的方式了
a.public继承,子类,public不变,protected不变,private变成不可访问的
b.protected 继承,子类,public->protected, protected不变, private变成不可访问的
c.private继承,子类,public->private, protected->private,private变成不可访问的
而需要注意的两点是
- 继承的方式影响的是派生类的派生类
- 继承的方式影响的只是基类的成员,不影响本类的访问修饰符
继承中还有一点就是继承关系的构造析构
- 继承里子类构造的初始化列表里默认为父类的初始化(很重要的一点)
- 局部顺序
子类构造->子类初始化列表->完成父类构造->完成子类构造->完成子类析构->回收子类空间->完成父类析构(在虚析构当中,虚函数完成的只是通过父类析构找到子类析构的过程,之后的过程和这个是一样的)
做一个小实验可以很好的看出来顺序
#include<iostream>
using namespace std; class CPerson
{
public:
CPerson()
{
cout << "CPerson()" << endl;
}
~CPerson()
{
cout << "~CPerson()" << endl;
}
};
class CSon : public CPerson
{
public:
CSon()
{
cout << "CSon" << endl;
}
~CSon()
{
cout << "~CSon" << endl;
}
};
int main()
{
{
CSon cs;
} system("pause");
return ;
}
第二个,多态,可以看一下上一篇帖子里 对于多态的讨论
2019-05-30 11:31:45 编程小菜鸟自我反思,大家可以留下自己的建议和意见,谢谢!!!
C++语言类之间的关系的更多相关文章
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...
- java 类与类之间的关系 及uml图
类与接口之间的关系 : 继承 类与类之间的关系 :继承关系 包含关系 类与对象之间的关系 : 实例 UML 类图中类与类之间的关系: 泛化关系(generalization) 关联关系(associ ...
- 【47】java的类之间的关系:泛化、依赖、关联、实现、聚合、组合
java的类之间的关系:泛化.依赖.关联.实现.聚合.组合 泛化: • 泛化关系(Generalization)也就是继承关系,也称为"is-a-kind-of"关系,泛化关系用于 ...
- UML类图及类与类之间的关系
原文地址:http://www.uml.org.cn/oobject/201211231.asp 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的 ...
- RTTI、dynamic_cast、typeid、类与类之间的关系uml
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...
- ZT UML 类与类之间的关系
1.聚合关系是关联关系的一种,是强的关联关系. 2.聚合是整体和部分之间的关系,例如汽车由引擎.轮胎以及其它零件组成. 3.聚合关系也是通过成员变量来实现的.但是,关联关系所涉及的两个类处在同 ...
- c++类之间的关系
我们知道,表达方式分为很多种,对于同一种事物,比如爱情,画家用图画和色彩表达爱恋:音乐家用音符和节奏表达喜爱之情,作家用文字表现爱慕. 而程序员怎么办? 程序员构建类,用类来表达单身之苦.因此,类就是 ...
- Java——类之间的关系
3.7 类之间的关系 3.7.1 泛化关系 类和类之间的继承关系及接口与接口之间的继承关系. 3.7.2 实现关系 类对接口的实现. 3.7.3 关联关系 类与类之间的连接,一个类可以知道另一个类的属 ...
- Java 中类与类之间的关系
在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...
随机推荐
- sql 数字转换为字符串补0
select right('00000000000'+convert(varchar(5),123),5) select right('00000000000'+cast(123 as var ...
- markdown 插入链接
插入链接 []里面写链接的标题或描述,可以省略不加不写 , () 里面是链接,必须有必须写 例如 [百度](https://www.baidu.com) 百度 参考文章 Markdown 插入链接
- .net Core 中DateTime在Linux Docker中与Windows时间不一致
最近写了一个.net core项目,部署到CentOS并在docker上运行的时候,发现DateTime.Now获取的时间与Windows不一致(定时执行的任务,晚了8个小时),在Windows中可以 ...
- C# 获取Windows 设备信息
namespace Beisen.Native { using Beisen.Pdf; using System; using System.Runtime.InteropServices; inte ...
- 在input内添加小图标或文字(元/月)等
文字: <td class="formValue"> <div class="input-group"> <input id=&q ...
- 【笔试题】某公司中有N名员工。给定所有员工工资的清单
排列员工工资顺序(C++map解法) 题目描述:某公司中有N名员工.给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资.他按照工资的频次降序排列.即给定清单中所有频次较高的工资将在频次较低 ...
- 惠普打印机和扫描仪修复医生 HP Print and Scan Doctor
https://support.hp.com/cn-zh/topic/printscandoctor-printing-problems http://ftp.hp.com/pub/printers/ ...
- Zabbix 3.2.6-Mysql多实例监控-Percona Monitoring Plugins自动发现
mysql多实例监控实录 系统环境: cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 内核版本: uname -r 3.1 ...
- mysql quick query row count using sql
1. command show table status like '{table-name}'; 2. sample mysql> use inventory; Database change ...
- Debugging Kafka connect
1. setup debug configuration mainClass: org.apache.kafka.connect.cli.ConnectDistributed VMOption: -D ...