---
# System prepended metadata

title: OOAD 各章重點 && 問題 && 解釋集

---

# 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
![](https://i.imgur.com/eGBPPX5.png)

### 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 ![](https://i.imgur.com/HXvpA3l.png)
    2. 解法二: 覆寫掉多重繼承class中的method ![](https://i.imgur.com/qJP8hrt.png)
    3. 解法三: 使用鑽石型繼承，使用virtual keyword ![](https://i.imgur.com/cFCe1T4.png)


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 題目&參考解答