【收集】C++ 中实现has-a关系
2013-05-24 15:55
239 查看
一,类包含对象
这种关系的实现无非就是一个类是另外一个类的成员而已。
Class A
{
B b;
.......
}
其实这就是一个最简单的has-a的关系的实现。
参见《C++箴言:通过composition模拟“has-a”》
二.私有继承
c++还有另一种实现has-a关系的途径----私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。
使用公有继承,基类的公有方法将成为派生类的公有方法。简而言之,派生类将继承基类的接口,这是is-a关系的一部分。使用私有继承,基类的公有方法将成为派生类的私有方法。简而言之,派生类不能继承基类的接口。正如从被包含对象中看到的,这种不完全继承是has-a关系的一部分。
因此私有继承提供的特性与包含相同:获得实现,但不获得接口。所以,私有继承也可以用来实现has-a关系。
阅读:《C++箴言:确保公开继承模拟“is-a”》
三、使用包含还是私有继承
由于既可以使用包含,也可以使用私有继承来建立has-a关系。大多数c++程序员倾向于前者。不过私有继承所提供的特性确实比包含多。例如,假设类包含保护成员,则这样的成员在派生类中是可用的,但在继承层次机构外是不可用的。如果使用组合奖这样的类保护在另一类中,则后者将不是排成类,而是位于继承层次结构之外,因此不能访问保护成员。但通过继承的到的将是派生类,因此他能够访问保护成员。
另一种需要使用私有继承的情况是需要重新定义虚函数。派生类可以重新定义虚函数,但包含类不能。使用私有继承,重新定义的函数将只能在类中使用,而不是公有的。
这种关系的实现无非就是一个类是另外一个类的成员而已。
Class A
{
B b;
.......
}
其实这就是一个最简单的has-a的关系的实现。
参见《C++箴言:通过composition模拟“has-a”》
二.私有继承
c++还有另一种实现has-a关系的途径----私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。
使用公有继承,基类的公有方法将成为派生类的公有方法。简而言之,派生类将继承基类的接口,这是is-a关系的一部分。使用私有继承,基类的公有方法将成为派生类的私有方法。简而言之,派生类不能继承基类的接口。正如从被包含对象中看到的,这种不完全继承是has-a关系的一部分。
因此私有继承提供的特性与包含相同:获得实现,但不获得接口。所以,私有继承也可以用来实现has-a关系。
阅读:《C++箴言:确保公开继承模拟“is-a”》
三、使用包含还是私有继承
由于既可以使用包含,也可以使用私有继承来建立has-a关系。大多数c++程序员倾向于前者。不过私有继承所提供的特性确实比包含多。例如,假设类包含保护成员,则这样的成员在派生类中是可用的,但在继承层次机构外是不可用的。如果使用组合奖这样的类保护在另一类中,则后者将不是排成类,而是位于继承层次结构之外,因此不能访问保护成员。但通过继承的到的将是派生类,因此他能够访问保护成员。
另一种需要使用私有继承的情况是需要重新定义虚函数。派生类可以重新定义虚函数,但包含类不能。使用私有继承,重新定义的函数将只能在类中使用,而不是公有的。
相关文章推荐
- C++私有继承实现has-a关系
- 面向对象的类关系及其C++实现
- c++正确处理 is-a has-a关系
- [收集]c++抽象类、纯虚函数以及巧用纯虚析构函数实现接口类
- c++中头文件与实现文件的关系
- use-a, has-a, is-a和实现关系 介绍
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- UML中定义的关系主要有6种: 依赖、关联、聚合、组合/合成、泛化、实现; 以及对应的C++体现
- 简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系
- C++基本算法收集及代码实现
- C++继承详解之四——is-a接口继承和has-a实现继承
- 面向对象的类关系及其C++实现
- 初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
- c++第八周【任务3】实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
- [收集]c++抽象类、纯虚函数以及巧用纯虚析构函数实现接口类
- use-a, has-a, is-a和实现关系
- C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现
- c++中头文件与实现文件的关系
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- [收集]c++抽象类、纯虚函数以及巧用纯虚析构函数实现接口类