所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用。通过类的组合能够在已有的抽象的基础上实现更复杂的抽象。 比如:

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;
}

【C++基础】类的组合的更多相关文章

  1. c++基础语法 构造函数 析构函数 类的组合

    1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...

  2. 设计模式基础:类及类关系的UML表示

    设计模式基础:类及类关系的UML表示 2009-10-26 17:00 by 宗哥, 1891 阅读, 1 评论, 收藏, 编辑 UML中,类关系分为这几种,泛化(generalization), 实 ...

  3. day31 类的组合及继承,文件目录规范

    Python之路,Day18 = Python基础18-面向对象继承与组合 类的继承 def talk(): print("I am come from talk..a") cla ...

  4. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  5. C#核心基础--类(2)

    C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...

  6. C++:类的组合

    在类中定义的数据成员一般都是基本数据类型或服复合数据类型.但是还可以根据需要使用 其他类的对象作为正在声明的数据成员.复杂的对象还可以有比较简单的对象一某种方式组合 而成,复杂对象和组成它的简单对象之 ...

  7. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

  8. c++,类的组合

    1. 在A类中以B类的对象作为成员变量,称为类的组合(composition). 可以先看看这篇文章理解组合的用处: C++中组合的使用 http://blog.csdn.net/jia_xiaoxi ...

  9. Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...

随机推荐

  1. GUI (图形界面)知识点

    一:组件知识点 JTextField:    作用:  定义文本域,只支持单行输入.                使用:  定义文本域:  JTextField jtf=new JTextField ...

  2. Spark SQL 源代码分析系列

    从决定写Spark SQL文章的源代码分析,到现在一个月的时间,一个又一个几乎相同的结束很快,在这里也做了一个综合指数,方便阅读,下面是读取顺序 :) 第一章 Spark SQL源代码分析之核心流程 ...

  3. 【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL

    内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会 ...

  4. TCP/IP 网络精讲:OSI七层模型(第二课)

    内容简介 1.前言 2.第一部分第二课:互联网的创立,OSI七层模型 3.第一部分第三课预告:OSI第一层,连接你的机器 前言 PS:昨天做了课程大纲之后,发现这个坑挖得有点大.不过既然挖了,岂有不跳 ...

  5. C# WebBrowser.DocumentCompleted 多次调用解决方法

    大概出现了以下几种情况. 1.WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complet ...

  6. AutoMapper在ABP框架

    AutoMapper在ABP框架中的使用说明 为了说明AutoMapper如何使用,我专门开设了一个专题来讲,如果您还没有查看该专题,请点击这里.既然系统地学习了AutoMapper,那么接下来就是该 ...

  7. pyspark简要原则

    概要 这是一个看前一段时间spark的python支持的时,有点简单的后pyspark内python代码,我们把一个一般流程.虽然几乎没有python,但基本上能看懂pyspark它是如何使不同的虚拟 ...

  8. JAVA缓存技术之EhCache(转)

    最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/ar ...

  9. 通过gradle运行测试脚本(转)

    练习一:HelloWorld 创建项目,源代码在src/main/java,测试源代码在src/test/java build.gradle的脚本: apply plugin: 'java' depe ...

  10. JUnit使用参数测试和一组测试

    JUnit该参数测试和一组测试使用简单 参数测试 作为替代阵列int a0,a1,a2喜欢,当测试加法assertEquals(3.0, h.add(1, 2), 0.1);相当于声明一个变量,要測试 ...