C_and_CPP 板


LINE

※ 引述《phdch (我们都活在这个城市里面)》之铭言: : 下面程式码 : class Apple:public Fruit : 中的修饰词public : 我知道是存取权限多少的关系 : class中的public成员,private成员,我理解 : 但public的类别(Fruit)要怎麽解释与子类别(Apple)的关系最好呢??? : 感谢 简单的说法是「Apple 是一种 Fruit」 (Apple is-a Fruit) 但其实这样的说法可能会引人误解, 因为在 OOP 中,「is-a」和一般人对「是一个...」或「属於...」的认知有一点不同 在 OOP 中,Apple is-a Fruit 意指所有对父类别 (Fruit) 的操作,都可以 运用在子类别 (Apple) 身上。比如说 Fruit 提供了 taste() 这个成员函式, 可以传回该水果尝起来的味道,那麽 Apple 也有义务提供 taste() 这个函 式,显示出苹果的味道如何。 class Fruit { public: virtual string taste() = 0; }; class Apple : public Fruit { public: virtual string taste() { return "Apple is sweat."; } }; 这样的好处是,对於不同种类的水果,我们都可以用相同的操作去显示它的味道: class Lemon : public Fruit { public: virtual string taste() { return "Lemon is sour."; // 柠檬很酸 } }; class ArtificialFruit : public Fruit { // 某种人造水果 public: virtual string taste() { string result; ... // 进行某些复杂的运算来得到它的味道 return result; } }; void print_taste(Fruit& fruit) { // 我不知道 fruit 是什麽水果 // 但我知道,只要是 Fruit,就可以用 taste() 取得它的味道 cout << fruit.taste() << endl; } int main() { Apple apple; Lemon lemon; ArtificialFruit unknow; // apple is-a Fruit // Fruit 提供 taste() 来取得水果的味道 // 所以 apple 也可以用 taste() 来取得味道 print_taste(apple); print_taste(lemon); // 同上,印出柠檬的味道 print_taste(unknow); // 同上,印出某种未知的味道 return 0; } 不管你发明怎样的水果,只要这种水果提供 taste() 界面,那你不需要修改 既有的 print_taste 程式码,就可以印出该水果的味道。这正是 OOP 中最 基本的概念。 至於 private inheritance,在概念上和 public inheritance 有极大的不同, 它并不会形成 is-a 的关系,而比较类似 has-a。如果你对这些议题有兴趣, 建议你可以看看以下的参考资料: * Effective C++ 条款 35:确定你的 public inheritance 模塑出 is-a 的关系 条款 36:区分介面继承及实作继承 条款 42:明智地运用 private inheritance * Exceptional C++ 条款 22:class 设计的常见错误 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.151.2
1F:推 VictorTom:推:) 小弟今天负责来推文的就对了XD 05/08 12:38
2F:推 Peruheru:这篇文章真有趣 05/08 12:38
3F:推 akasan:推~不过到现在还没实际用过public继承以外XD 05/08 15:37
4F:→ tinlans:关键字:LSP 05/08 21:50
5F:推 softwind:好文(好闻) 推一个 05/08 22:29







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP