9.1组合
它是一种“is part of”的关系(部分与整体)。组合是一个类中包含另外一个类对象。相比聚合,组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合的对象不能脱离组合对象独立存在,整体不存在,部分一定不存在。举例:人与手、人与头之间的关系,人需要包含头,手是人的一部分且 不能脱离人独立而存在。
在C++语法中,通常在组合类中包含被组合类对象来实现组合关系如下例
9.2依赖
他是一种“uuser a ”的关系。一个对象的某种行为依赖于另一个类对象,被依赖的对象视为完成某个功能的工具,并不持有对他的引用,只有在完成某个功能的时候才会用到,而且是必不可少的。依赖之间是没有生命周期约定关系的。举例:人要完成编程这件事,那么需要用到电脑,电脑作为一个工具,其他时候不需要,电脑也不可能作为人的属性而存在(非组合关系),人必须依赖于电脑才能完成编程这件事。
C++语法中,代码的表现形式为多种,通常将被依赖的对象作为另一类方法的参数的形式实现两个类之间的依赖关系。
9.3关联
它是一种“has a ”的关系。关联不是从属关系,而是平等关系,可以拥有对方,但不可以占有对方。完成某个功能与被关联的对象有关,但关联的对象可有可无。被关联的对象无生命周期约束关系,被关联的对象的声明周期由谁创建就由谁来维护,只要二者同意,可以随时解除关系或者进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的。举例:人和朋友一起玩游戏。
C++语法中,通常在关联的类中定义被关联类对象的指针形式实现两个类之间的关联关系。
9.4聚合
他是一种“owns a ”的关系。多个被聚合的对象聚集起来形成一个大的整体,聚合的目的是为了统一进行管理同类型的对象,聚合是一种弱所属关系,被聚合的对象还可以再被别的对象关联,所以被聚合对象是可以共享的。虽然是共享的,聚合代表的是一种更亲密的关系,相当于加强版本的关联。C++语法中,通常在聚合类中定义被聚合对象指针的容器
#include<iostream>
using namespace std;
/*
组合:部分与整体 包含与被包含有生命周期的约束关系
依赖:完成某个功能必须用到的以来的对象,一般当做工
具对待,没有生命周期的约束关系
关联:可有可无的平等关系没有生命周期的约
束关系
聚合:本聚合的对象组合起来(容器),统一管理,有生命
周期约束关系,实例代码和结果如下
*/
class CHand
{
public:
void move()
{
cout<<"小手挥舞移动......"<<endl;
}
};
class CComputer
{
public:
void Compile()
{
cout<<"正在编译生成可执行程序"<<endl;
}
};
class CFriend
{
public:
void play()
{
cout<<"我的朋友正在玩耍"<<endl;
}
};
class CPeople
{
public:
CHand m_hand;
CFriend *m_pFri;
CPeople()
{
m_pFri = nullptr;
}
void clap()
{
m_hand.move();
cout<<"发出阵阵掌声"<<endl;
}
void program(CComputer*pComp)
{
if(pComp)
{
m_hand.move();
cout<<"劈里啪啦,敲击键盘,输入代码"<<endl;
pComp->Compile();
}
}
void playwangzhe()
{
cout<<"准备打王者"<<endl;
if(m_pFri)
{
cout<<"走啊,开黑去"<<endl;
m_pFri->play();
cout<<"拿下五杀.victory"<<endl;
}
else
{
cout<<"自己匹配"<<endl;
cout<<"拿下五杀.victory"<<endl;
}
}
};
class CFaimly
{
public:
CPeople* peoArr[10];
CFaimly()
{
for(int i = 0;i<10;i++)
{
peoArr[i]=nullptr;
}
peoArr[0] = new CPeople;
peoArr[1] = new CPeople;
peoArr[2] = new CPeople;
}
~CFaimly()
{
for(int i = 0;i<10;i++)
{
if(peoArr[i])
{
delete peoArr[i];
peoArr[i] = nullptr;
}
}
}
public:
void ALLPeopleProgra(CComputer* pComp)
{
for(int i = 0;i<10;i++)
{
if(peoArr[i])
{
cout<<"第"<<i<<"号人:";
peoArr[i] -> program(pComp);
}
}
}
};
int main()
{
//
CFaimly tst;
CComputer *pComp = new CComputer;
tst.ALLPeopleProgra(pComp);
system("pause");
return 0;
}
9.5继承
(1)父类
(2)子类
子类可以使用父类成员(包括函数)
函数使用与之类比
若子类父类存在重名成员时,使用子类,则优先调用子类的成员,若使用父类成员则以一下格式输出
cout<<son.Cfather::m_money<<endl;
调用函数时与之类比