【C++基础】类的组合
所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用。通过类的组合能够在已有的抽象的基础上实现更复杂的抽象。 比如:
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++基础】类的组合的更多相关文章
- c++基础语法 构造函数 析构函数 类的组合
1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...
- 设计模式基础:类及类关系的UML表示
设计模式基础:类及类关系的UML表示 2009-10-26 17:00 by 宗哥, 1891 阅读, 1 评论, 收藏, 编辑 UML中,类关系分为这几种,泛化(generalization), 实 ...
- day31 类的组合及继承,文件目录规范
Python之路,Day18 = Python基础18-面向对象继承与组合 类的继承 def talk(): print("I am come from talk..a") cla ...
- python基础——类和实例
python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...
- C#核心基础--类(2)
C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...
- C++:类的组合
在类中定义的数据成员一般都是基本数据类型或服复合数据类型.但是还可以根据需要使用 其他类的对象作为正在声明的数据成员.复杂的对象还可以有比较简单的对象一某种方式组合 而成,复杂对象和组成它的简单对象之 ...
- OC基础 类的三大特性
OC基础 类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...
- c++,类的组合
1. 在A类中以B类的对象作为成员变量,称为类的组合(composition). 可以先看看这篇文章理解组合的用处: C++中组合的使用 http://blog.csdn.net/jia_xiaoxi ...
- Python基础-类
Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...
随机推荐
- 无阻塞情况connect生产EINPROGRESS错
今天的游戏开发client测试程序,非常多,因为出现client.后connect成功.代码证recv系统调用.后来发现,可能是由于socket默认模式被阻止,这将使很多client 接处于链接却不能 ...
- java提高篇(十三)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- Nancy 框架
Nancy 框架 Nancy 框架 1.是一个轻量级用于构建http相应的web框架: 2.与mvc类似,有自己的路由机制: 3.可以处理 DELETE , GET , HEAD , OPTIO ...
- CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)
JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction ma ...
- 何时使用SET和SELECT为变量赋值
原文:何时使用SET和SELECT为变量赋值 我们经常使用SET和SELECT来为变量复制,但是有时候,只能选其一来使用,下面来看看这些例子,本例中使用AdventureWorks数据库来做演示. 通 ...
- SPOJ 15. The Shortest Path 堆优化Dijsktra
You are given a list of cities. Each direct connection between two cities has its transportation cos ...
- Java 新特性(4) - JDK 8 新特性
http://www.360doc.com/content/14/0620/11/1370831_388286071.shtml
- 单机部署redis主从备份
redis为了避免单点故障,也支持主从备份.个人在做主从备份的实验时,因为机器数量有限,一般非常少有多台机器做支撑. 本文就将叙述怎样在一台电脑上实现redis的主从备份. 同一台机器上部署多个red ...
- 如何基于对话框的project基于改变BCG的
一,stdafx.h 增加在下面的例子.BCGCBProInc.h间接介绍lib. #include <BCGCBProInc.h> // BCGControlBar Pro #if ...
- Dubbo与Zookeeper、SpringMVC整合和利用(负载均衡、容错)
互联网发展,扩大了网站应用程序的大小.传统的垂直应用架构已经无法应付.分布式服务架构和流量计算架构势在必行,Dubbo是一个分布式服务框架.在这样的情况下诞生的.如今核心业务抽取出来.作为独立的服务, ...