C 中的抽象類及動態型別轉換

2021-09-25 03:00:49 字數 1779 閱讀 7762

類太抽象以至於無法例項化就叫做抽象類(描述是不是絕了,類越往下派生肯定越具體,越往上肯定越抽象)

問題:shape類層次中,getarea()函式放在哪個層次

選擇1:放哪兒都行:shape中或子類中定義getarea()

選擇2:強制要求shape子類必須實現getarea()

virtual double getarea() = 0;  // 在shape類中

circle子類必須實現getarea()純虛函式才能例項化

抽象類不能例項化(建立物件)

// shape是派生類物件的引用

如果你要修改函式,讓它顯示圓的半徑該怎麼辦?

(1)     沿繼承層級向上、向下及側向轉換到類的指標和引用

(2)     轉指標:失敗返回nullptr

(3)     轉引用:失敗拋異常

先將shape物件用dynamic_cast轉換為派生類circle物件

然後呼叫派生類中獨有的函式 

s = c; //ok,隱式上轉

shape* s = new circle(1);

circle *c = nullptr;

c = dynamic_cast (s); //顯式下轉

父上,子下

上轉隱,下轉顯

shape s;//基類物件

circle c;//派生類物件

1可將派生類物件截斷,只使用繼承來的資訊(意思是派生物件可以賦值給基類物件,截斷自己將繼承來的部分賦值給基類)

2但不能將基類物件加長,無中生有變出派生類物件(二基類物件不能賦值給派生類物件,因為radius無從賦值)

那麼,下面四個語句的正確與否很顯而易見了:

①s = c;          (√)

②c = s;        (×)

③shape &rs = c;(√)

④circle &rc = s;     (×)

不恰當的記錄下:(保護屬性的資料或函式可被派生類成員訪問)

C 中的抽象類

開閉原則 ocp 是物件導向設計中 可復用設計 的基石,是物件導向設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。對於擴充套件是開放的,對於修改是關閉的,這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行為。也就是說,...

C 中的抽象類

1 宣告乙個抽象方法使用abstract關鍵字。2 乙個類中可以包含乙個或多個抽象方法。3 抽象類中可以存在非抽象的方法。4 抽象類不能被直接被例項化。5 實現抽象類用 冒號 實現抽象方法用override關鍵字。6 抽象類可以被抽象類所繼承,結果仍是抽象類。7 抽象方法被實現後,不能更改修飾符。d...

C 中的抽象類 抽象方法

抽象類 abstract 修飾符可與類和方法一起使用 定義抽象類的目的是提供可由其子類共享的一般形式。子類可以根據自身需要擴充套件抽象類。抽象類不能例項化。抽象方法沒有函式體。抽象方法必須在子類中給出具體實現。在以下情況下,某個類將成為抽象類 當乙個類的乙個或多個方法為抽象方法時。當該類為乙個抽象類...