您的位置:首页 > 编程语言 > C语言/C++

C++面向对象编程<九>:面向对象-类之间的关系

2016-02-23 20:46 288 查看

OOP

面向对象:类与类之间的关系,分为三种:Inheritance(继承)、Composition(组合)、Delegation(委托)

**基于对象:单一类的封装

Composition组合,表示has-a关系

看一个栗子,如图此class里有(has-a)deque,常用图来表示类之间的关系。



上面这张图包含一种设计模式:Adapter(适配),含义如下:

已经有deque,但客户需要queue,而deque的功能完全能满足queue(只需要开放deque的一些接口即可),而queue就是一种Adapter.

composition下的构造与析构

构造函数从内到外:如图:



container的构造函数首先调用component的default构造函数(为什么调用默认构造函数呢?因为component可能有好几个构造函数,编译器不知道调用哪一个?因此只能调用默认构造函数,当然要想不调用默认构造函数,也可以自己写),然后才执行自己。

Container::Container(...) : Component() { ... }


**析构函数由外而内**container的析构函数首先执行自己,然后才执行component的析构函数。

Delegation(委托) (Composition by reference

见下图



左边has右边(has的是指针),右边是什么,左边其实不知道;左边的class和右边的class用指针相连,它们的生命周期不一致哦!

Composition和Delegation虽然都是has-a关系,但还是有区别的。如下:Composition:外部和内部一起出现;Delegation:可能外部的先创建出来,等到需要右边的时候再创建出来,不同步。

这种写法非常有名:左边的class只是对外的接口,而右边的class来实现。叫做pimpl(pointer implementation)或handle/body(左边是句柄,右边是body)这个指针也可以指向不同的实现类,具有一种弹性,右边怎么变都不影响左边

有三个字符串都在用同一个hello,三个东西共享一个东西(共享当然很好,节省内存)。但a如果要改变hello不能影响b和c,当要改变内容时,单独拿一份给a来改,b和c来共享原来的东西。但是只有在更改时才给一份副本来写,这就是Copy on write

Inheritance继承,表示is-a

见下图



上面的图表示父类的数据是可以完整继承的,但这不是继承最有价值的部分,最有价值的是和虚函数的搭配使用。

继承下的构造与析构

子类的对象有父类的成分在里面,



构造由内而外

Derived的构造函数首先调用Base的default构造函数,然后才执行自己

Derived::Derived(...) : Base() { ...};


析构由外而内

Derived的析构函数首先执行执行自己,然后才调用Base析构函数。

Derived::~Derived(...) { ... ~Base() };


base class的dtor必须是virtual,否则会出现undefined behavior

良好的编程习惯:base class的析构函数写成virtual
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: