lxidea的 Boolan C++面向对象高级编程(上)学习笔记(三)

本周是C++面向对象高级编程(上) 的第三周,也是最后一周学习了。本周的内容渐渐的进入到了C++设计的关键,也就是面向对象编程,而不是基于对象编程 —— 即,让对象与对象之间产生联系。

那么,在面向对象编程中,对象与对象之间的关联有三种关系,分别是

1. 继承 Inheritance
2. 复合 Composition
3. 委托 Delegation

1. 其中,从最简单的复合来入手,复合表示has-a,即一个类里面具有的成员变量是另一个类的对象。在内存中,复合了的类中,会包含另一个类对象的内存,如果有多层复合,那便会产生多层的包含。当然,如果有包含指针的话,就只包含指针本身的内存,指针所指的内存除外。
在复合关系下,构造函数将先调用它成员变量所属类的构造函数,然后再来构造自己。析构函数反之,像剥洋葱一样,先析构自身,再析构成员变量 —— 由外而内。

2. 对于委托来说,又称,Composition by reference。一个类中有一个成员变量,它是一根指向另外一个类对象的指针。这个指针在类构造时,可能不会马上分配内存。或者,若干个类对象中的这个指针,会指向另外一个类的同一个对象。这样会比较节省内存。当其中一个对象要更改指针所指向内存的值的时候,指针所指的对象会单独拷贝一份出来让那个对象拿去修改,而其他对象可以继续共享原来的那个值。
此外,使用委托的外部类,在其外部接口不变的情况下,内部指针指向的对象类可以有各种修改和变动。但最终外部用户所使用的外部类的成员函数和方法都不变,因此保证了用户使用的遍历和稳定。

3. 继承。对于继承来说,父类,或者叫基类,它的成员特性和函数,可以被子类所继承。继承后,子类拥有父类的所有成员变量和函数,而不需要重新定义了。从感性理解上,可以认为子类是一种父类的类型,比如香蕉是一种水果;白菜是一种蔬菜。这时,水果是香蕉的父类,香蕉是子类;蔬菜是白菜的父类,白菜是子类。子类可以通过子类对象调用父类的函数。在构造时,子类的构造函数中要在初始列前加入对父类的构造函数调用。此外,在析构时,在子类析构函数执行后,才调用父类的析构函数。

3.1 对应继承关系,有额外的一种特性,virtual函数,即虚函数。对于一般的普通函数,非虚函数,如果父类没定义,子类可以自己定义。如果父类定义了,那么子类不能再更改了。对于虚函数,父类有函数的定义,但是子类可以自己重新定义。而纯虚函数,在父类中完全没有默认定义,子类务必要在类设计中实现。

3.2 实际中的类设计,很可能产生 (继承 + 复合)的类设计,这个时候构造和析构函数的执行顺序就比较特别了。

3.3 面向对象程序设计中,还有(委托 + 继承)的类设计,它的功能最为强大。

3.3.1 它可以用来实现视图+数据的功能。可以将一份数据中attach上一系列的视图对象的指针,当数据更新后,数据对象通过指针一一通知各个视图对象更新它们的界面和表现。而这个视图类Observer是父类,将来派生出来的子类都可以放入到数据对象的容器中。

3.3.2 另一个异常强大并且巧妙的设计模式是prototype的模式。父类在设计的时候,预留下将来可能会派生的子类的调用方法,将子类的静态原型通过子类的静态函数返回并放入父类的原型列表中,这样,父类在今后需要生成子类实例的时候,通过子类原型的调用,得到相应的子类对象。这样的设计可谓精妙。

注意:委托关系里面,若干对象的成员指针共享一个成员对象时,这个对象可以根据修改的需要,单独拷贝一份出来,不影响其他对象。这种方式叫做Copy on Write。这个方式和前两周在设计拷贝赋值和拷贝构造函数时强调的深拷贝有略微不同。这个地方并不矛盾。Copy on Write模式在需要的时候可以节省内存并提供一些独特的特性。而预防浅拷贝时,被拷贝的那种类并不具备Copy on Write的特性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容