【Effective C++】对象之间的复合(composition)关系 —— has a 以及 is-implemented-in-terms-of

本文探讨了C++中的复合关系,特别是has-a和is-implemented-in-terms-of的概念。通过示例解释了Person类如何展示has-a关系,并分析了使用std::list实现std::set功能时,应当避免错误的public继承,而应选择is-implemented-in-terms-of的关系来正确实现。
摘要由CSDN通过智能技术生成

复合关系

当某种类型的对象内含其他种类型的对象时,它们之间便是这种复合关系。比如:

class Address {
    //... };
class PhoneNumber {
    //... };
class Person 
{
   
public:
	//...
private:
	std::string name;
	Address address;
	PhoneNumber voiceNumber;
	PhoneNumber faxNumber;
};

在这里例子中,Person 对象就由 std::stringAddressPhoneNumber 复合而成。


has-a 以及 is-implemented-in-tems-of

之前说过,public 继承就意味着 is-a 的关系。对于复合,它也有它对应的含义,它有两个意义。复合意味着 has-a 或者 is-implemented-in-terms-of。
上面的 Person class 就是 has-a 的关系。比较麻烦的是区分 is-a 和 is-implemented-in-terms-of 的关系。

比如说,你需要写出一个模板类,来实现由不重复对象组成的容器。你的第一反应,当时是直接使用 stl 中提供的 std::set 容器。但是这个容器背后是由红黑树实现的,虽然查找、插入、删除的速度都在对数级,但是每个元素都有三个指针的额外开销。你不希望用空间换时间,所以想自己另外实现一个模板类。
经过考虑之后,你决定顶层用 stl 中的 std::list 去实现 std::set 的功能。要想调用 std::list 。当然有两种实现形式:第一是继承它,这样就可以获得它的成员;或者是内含它的对象或指针,通过这个对象或指针去调用它的成员。如果你打算采用第一种方式:

tem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值