# OOAD 各章重點 && 問題 && 解釋集 :::danger 各個章節的 Lab 問題 & 參考解答之後再慢慢做整理 ::: [toc] ## Chapter 2: Inheritance ### 章節重點&問題 :::success :fire:Tip - 繼承的判斷方式: B是否為A - 繼承的原則: - class 只能使用自己需要的method - 若member function 可能被subclass給override掉,則將其設為virtual。 ::: :::warning :question: Faq :::spoiler 濫用繼承會造成什麼問題? - 繼承的subclass中的method可能override掉原本class的method - 降低未來程式碼的reuse特性 ::: ### 投影片疑問 - p.34 多的 pet destructor  ### Lab 解釋 - Lab 12 - C++ : ```c++= student(int age, int height, int studentID): person(age, height){} ``` - JAVA : ```java= super(age, height) ``` ## Chapter 3: Polymorphism ### 章節重點&問題 :::success :fire:Tips - 核心程式碼不會根據程式擴充而有所改變 (可以不用管subclass type) - 通常搭配繼承使用 > 如果繼承的class沒有做多型的事情,那這個程式碼一點都不物件導向 - 永斌 ::: :::warning :question: Faq 1. 何謂多型? 2. What is Object Slicing? :::spoiler 參考解答(如有錯請直接修正) 1. 可以用base class的指標或參考來進行處理時,可以依照其subtype來進行不同事情。 2. 當pass by value(copy)的時候,compiler會自動將object中的多餘的(繼承來的)部分給剃除,只傳入base object的部分 (想像記憶體空間) ::: ### Lab 題目&參考解答 #### Lab 5 - 壞處是會出現萬惡的 copy-paste programming #### Lab 15 題目: Modify the attachment by using polymorphism. ```cpp= #include <stdio.h> #include <assert.h> #define SIZE 3 typedef enum { Comic, Novel, Magazine } book_type; typedef struct Book { book_type type; } Book; void print_book_type(Book*); int main(void) { Book books[SIZE]; books[0].type = Comic; books[1].type = Novel; books[2].type = Magazine; for (int i = 0; i < SIZE; i++) { print_book_type(&books[i]); } return 0; } void print_book_type(Book* book) { assert(book); switch (book->type) { case Comic: printf("Comic\n"); break; case Novel: printf("Novel\n"); break; case Magazine: printf("Maganize\n"); break; } } ``` ## Chapter 4: multiple inheritance ### 章節重點&問題 :::warning :question: Faq 以下為連續問題 1. 什麼是Percolating Up? - 這樣做會產生什麼後果(壞處)? - 可以如何避免? 2. 多重繼承在C++中可能會造成什麼問題? - 可以如何解決上述問題?(三種方法) 3. Java 新增什麼樣的方法(概念)來"避免"上述提到的問題? - 這個方法有什麼限制?他為何能巧妙的避開上述的問題? - 如何在C++中實作類似的概念? --- :::spoiler 參考解答 1. 為了要滿足多型的應用,將位在繼承的子類別的method給拉到父類別中(提升) - class可能擁有不該屬於自己的method(不符合直覺) - 使用多重繼承 3. 造成ambiguity。因為有兩份相同的基底,當多型時compiler無法辨別要使用哪一個。 1. 解法一: casting ambiguous attributes or methods  2. 解法二: 覆寫掉多重繼承class中的method  3. 解法三: 使用鑽石型繼承,使用virtual keyword  3. 禁止多重繼承,並使用interface。 - 因為interface限制只定義method的名稱但不包含任何實作(預設為absract),所以implement的class在多型時就不會有ambiguous的問題(因為在繼承的subclass才實作該method)。 - 更多參考資料: https://stackoverflow.com/questions/2801878/implementing-two-interfaces-in-a-class-with-same-method-which-interface-method - 模仿Java interface的概念去繼承class ::: ### Lab 題目&參考解答
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up