【C++基础】类的组合
来源:互联网 发布:qq群怎么优化排名 编辑:程序博客网 时间:2024/06/03 07:26
所谓类的组合是指:类中的成员数据是另一个类的对象或者是另一个类的指针或引用。通过类的组合可以在已有的抽象的基础上实现更复杂的抽象。 例如:
1、按值组合
#include<iostream.h>#include<math.h>class Point{public:Point(int xx,int yy)//构造函数{x=xx;y=yy;cout<<"Point's constructor was called"<<endl;}Point(Point &p);//拷贝构造函数int GetX(){return x;int GetY(){return y;}~Point(){cout<<"Point's destructor was called"<<endl;}private:int x,y;};Point::Point(Point &p){x=p.x;y=p.y;cout<<"Point's copyConstructor was called"<<endl;}class Distance{private:Point p1,p2; //按值组合,将类Point的对象声明为类Distance的数据成员double dist;public:Distance(Point a,Point b);//包含Point类double GetDis(void){return dist;} ~Distance(){cout<<"Distance's destructor was called"<<endl;}};Distance::Distance(Point a,Point b):p1(a),p2(b){double x=double(p1.GetX()-p2.GetX());double y=double(p1.GetY()-p2.GetY());dist=sqrt(x*x+y*y); cout<<"Distance's constructor was called"<<endl<<endl;}void main(){Point myp1(1,1),myp2(4,5);Distance myd(myp1,myp2);cout<<'\n'<<"the distance is: "<<myd.GetDis()<<endl<<endl;}2、按引用组合
class ZooAnimal{public:// ....private:Endangered *_endangered1 ; //按指针组合Endangered &_endangered2 ; //按引用组合};
另外再看一个例子:
如果鸟是可以飞的,那么鸵鸟是鸟么?鸵鸟如何继承鸟类?[美国某著名分析软件公司2005年面试题]
解析:如果所有鸟都能飞,那鸵鸟就不是鸟!回答这种问题时,不要相信自己的直觉!将直觉和合适的继承联系起来还需要一段时间。
根据题干可以得知:鸟是可以飞的。也就是说,当鸟飞行时,它的高度是大于0的。鸵鸟是鸟类(生物学上)的一种。但它的飞行高度为0(鸵鸟不能飞)。
不要把可替代性和子集相混淆。即使鸵鸟集是鸟集的一个子集(每个驼鸟集都在鸟集内),但并不意味着鸵鸟的行为能够代替鸟的行为。可替代性与行为有关,与子集没有关系。当评价一个潜在的继承关系时,重要的因素是可替代的行为,而不是子集。
答案:如果一定要让鸵鸟来继承鸟类,可以采取组合的办法,把鸟类中的可以被鸵鸟继承的函数挑选出来,这样鸵鸟就不是“a kind of”鸟了,而是“has some kind of”鸟的属性而已。代码如下:
#include<string>#include<iostream>using namespace std;class bird{public:void eat(){cout<<"bird is eating"<<endl;}void sleep(){cout<<"bird is sleeping"<<endl;}void fly();};class ostrich{public:eat(){smallBird.eat();}sleep(){smallBird.sleep();}private:bird smallBird; //在这里使用了组合,且是按值组合:将bird的一个对象声明为另一类的数据成员};int main(){ostrich xiaoq;xiaoq.eat();xiaoq.sleep();return 0;}
1 0
- 【Linux基础】类的组合
- 【C++基础】类的组合
- 关于objective-c中类的组合
- C++:组合类
- 某基础的组合问题
- Objective - C基础: 第二天 - 10.继承的使用场合和组合使用
- <设计模式可复用面向对象软件的基础> [2.3]、组合模式(C#)
- 组合的C语言实现
- 组合的C语言实现
- 第十二周C++【任务4】类的组合与继承。
- 组合类和友员类的差异有哪些(C++)
- C++(笔记)string,类的组合练习
- 特殊的组合问题(基础部分)
- 自定义组合控件的写法(基础)
- CodeForces 128C Games with Rectangle [组合数学+基础DP]
- 递归实现数字的组合(C++)
- C(n,m)的组合问题
- 【组合】C(n,k)的奇偶性
- html5中不再支持table的cellspacing和cellpadding属
- 转 c++ 中头文件重复定义的问题
- C++Builder 高级编程技巧
- Windows平台下动态链接库的总结
- Navicat Premium 出现cannot create oci environment错误
- 【C++基础】类的组合
- memcahe mongodb
- 【github】常用Github项目类库
- Shell脚本命令的执行顺序
- Android源码阅读笔记1 - init.c的main函数分析
- JavaScript自动生成博文目录导航
- iOS中3种正则表达式的使用与比较
- 无题
- 数据结构与算法学习之路:二分插入排序