在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变成不可访问的

而需要注意的两点是

  1. 继承的方式影响的是派生类的派生类
  2. 继承的方式影响的只是基类的成员,不影响本类的访问修饰符

继承中还有一点就是继承关系的构造析构

  1. 继承里子类构造的初始化列表里默认为父类的初始化(很重要的一点)
  2. 局部顺序

子类构造->子类初始化列表->完成父类构造->完成子类构造->完成子类析构->回收子类空间->完成父类析构(在虚析构当中,虚函数完成的只是通过父类析构找到子类析构的过程,之后的过程和这个是一样的)

做一个小实验可以很好的看出来顺序

 #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++语言类之间的关系的更多相关文章

  1. 从零开始学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 ...

  2. java 类与类之间的关系 及uml图

    类与接口之间的关系 : 继承 类与类之间的关系 :继承关系  包含关系 类与对象之间的关系 : 实例 UML 类图中类与类之间的关系: 泛化关系(generalization) 关联关系(associ ...

  3. 【47】java的类之间的关系:泛化、依赖、关联、实现、聚合、组合

    java的类之间的关系:泛化.依赖.关联.实现.聚合.组合 泛化: • 泛化关系(Generalization)也就是继承关系,也称为"is-a-kind-of"关系,泛化关系用于 ...

  4. UML类图及类与类之间的关系

    原文地址:http://www.uml.org.cn/oobject/201211231.asp 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的 ...

  5. RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

  6. ZT UML 类与类之间的关系

    1.聚合关系是关联关系的一种,是强的关联关系.     2.聚合是整体和部分之间的关系,例如汽车由引擎.轮胎以及其它零件组成. 3.聚合关系也是通过成员变量来实现的.但是,关联关系所涉及的两个类处在同 ...

  7. c++类之间的关系

    我们知道,表达方式分为很多种,对于同一种事物,比如爱情,画家用图画和色彩表达爱恋:音乐家用音符和节奏表达喜爱之情,作家用文字表现爱慕. 而程序员怎么办? 程序员构建类,用类来表达单身之苦.因此,类就是 ...

  8. Java——类之间的关系

    3.7 类之间的关系 3.7.1 泛化关系 类和类之间的继承关系及接口与接口之间的继承关系. 3.7.2 实现关系 类对接口的实现. 3.7.3 关联关系 类与类之间的连接,一个类可以知道另一个类的属 ...

  9. Java 中类与类之间的关系

    在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系     继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...

随机推荐

  1. 第十四周助教工作总结——NWNU李泓毅

    助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:团队项目需求改进与系统设计:https://www.cnblogs.com/nwnu-daizh/p/ ...

  2. 树莓派python 控制GPIO

    sudo pip install rpi.gpio #!/usr/bin/env python # encoding: utf-8 import RPi.GPIO as GPIO import tim ...

  3. mariadb galera群集故障记录

    负责galera上执行删除语句 delete from t1 where group_id= and group_id=; 执行后,群集破坏,除了主节点存活,其他俩个节点全都停掉. 查看galera的 ...

  4. vue报错:There are multiple modules with names that only differ in casing.

    今天写项目时,遇到报错信息如下: 经过多次排除及参考网上文章,最后找到问题所在 排查原因:1 .在引用组件时,路径大小写不对也会造成此报错,看例子:错误写法: 正确写法: 2.在组件使用vuex时,引 ...

  5. button按钮的状态为disabled禁用状态,click事件无法触发,但是为什么touchstart下却依然可以触发

    切换到移动模拟模式,并点击按钮,查看控制台. 发现click没有事件没有触发,而touch事件依然触发. 解决办法: 对于移动端我们使用css来禁止按钮,达到disable的效果: 对,就是这个神奇的 ...

  6. SpringBoot配置加载顺序

    一般我们会将SpringBoot应用需要的配置内容放在项目工程中,然后通过spring.profiles.active或是通过Maven来实现多环境的支持.但是,当团队逐渐壮大,分工越来越细之后,往往 ...

  7. 【转载】 clusterdata-2011-2 谷歌集群数据分析(三)

    原文地址: https://blog.csdn.net/yangss123/article/details/78306270 由于原文声明其原创文章不得允许不可转载,故这里没有转载其正文内容. --- ...

  8. web项目访问被拦截

    如图,一启动就出现下图登录界面 原因很简单就是被拦截了.pom.xml中引入了下面的包,注释掉就可以了.当然如果用了shiro等权限框架也可能出现类似问题.谁copy进来的,盘他. <!-- h ...

  9. java.io.EOFException at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer

    如题,网上找了相关资料查明是websocket连接超时的问题.使用了反向代理,因此超过60S没有数据传输的连接会断开. 把代理的那个超时时间设置长一点,无限长.你开什么玩笑!那还代理个啥玩意. 解决方 ...

  10. Qt编写自定义控件70-扁平化flatui

    一.前言 对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反 ...