C++【侯捷】——— 复合与继承

C++【侯捷】——— 复合与继承


主要讲类和类之间的关系,不是单类的设计,这个就叫做面向对象的编程。

Composition

复合,表示has-a。
template <class T, class Sequence = deque >
class queue {

protected:
Sequence c;
public:
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
reference front() { return c.front(); }
reference back() { return c.back(); }
//
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_front(); }
};
用图来表示,实心菱形边的是容器,箭头端的表示容器中拥有一个对象,A拥有B,A中的部分或全部功能用B来实现。
所以复合可以用来实现改装,截取后只开放部分功能,这种设计模式就叫做Adapter。通俗来说,客户需要一个B,现在手上有个A,A已经可以完全实现B的所有功能,但是名字不一样或者还包含其他的功能,用上面这种复合来实现改装。
构造由内而外,析构由外而内。
Container的构造函数首先调用Component的default构造函数,然后才执行自己。Container的析构函数首先执行自己,然后才调用Component的析构函数。
Container::Container(…) : Component() { … };
Container::~Container(…) : ~Component() { … };
粗体的是编译器加上的,析构是先把自己的做完才做内部的析构。构造是先创建内部的再创建自己。如果内部的析构/构造函数有好几个,编译器指挥调用默认的那个。不满足自己的需求的情况下得自己些外部的构造和析构函数。

Delegation

委托,Composition by reference。是创建的类A中包含一个B的指针,和复合的图的区别是菱形是空心的。
class StringRep;
class String {
public:
String();
String(const char* s);
~String();
private:
StringRep* rep;
};
通过指针将两个类连接起来,构造的时候和上面的复合比,就可以不用同步,先创建外面的包含者,等到用里面的被包含者的时候才进行创建。这种写法很大的好处是,可以把实现和对外的接口分开,当接口需要一个动作时,调用里面的类来实现,这种方法叫pimpl:pointer implant,也叫做Handle&Body。接口就可以保持不变,实现可以任意变,添加了一种弹性,也叫做编译防火墙,接口中的指针可以指向不同的类。就可以让多个类关联到同一个接口上,实现一种共享,共享的前提时不能轻易改动全局。当有一个要改变内容的时候,copy一份让他来改,这种就叫做copy on write。

Inheritance

继承表示is-a。

struct _List_node_base
{
    _List_node_base* _M_next;
    _List_node_base* _M_prev;
};
template<typename _Tp>
struct _List_node
    **: public _List_node_base**
{
    _Tp _M_data;
}
C++有三种继承p

ublic、private、protect,Java只有一种,所以也不用写就是public。用图来表示一端是空心的三角形指向的是被继承的对象_List_node_base。另一端什么也没有是继承的类_List_node,模板在类的右上角用一个正方形表示。继承最有价值的地方,是和虚函数进行搭配。
构造由内而外,析构由外而内。Derived的构造函数首先调用Base的default构造函数,然后才执行自己。Derived的析构函数首先执行自己,然后才调用Base的析构函数。
Derived::Derived(…) : Base() { … };
Derived::~Derived(…) : ~Base() { … };
粗体的是编译器加上的,析构是先把自己的做完才做内部的析构。构造是先创建内部的再创建自己。如果内部的析构/构造函数有好几个,编译器指挥调用默认的那个。不满足自己的需求的情况下得自己些外部的构造和析构函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值