在繼承課程的介紹中,我們提到使用派生類的最大好處之一是能夠重用已編寫的**。您可以繼承基類功能,然後新增新功能,修改現有功能或隱藏您不需要的功能。在接下來的幾節課中,我們將仔細研究這些事情是如何完成的。
首先,讓我們從乙個簡單的基類開始:
現在,讓我們建立乙個繼承自base的派生類。因為我們希望派生類能夠在例項化派生物件時設定m_value的值,所以我們將使derived建構函式在初始化列表中呼叫base建構函式。#include class base
void identify()
};
向派生類新增新功能class derived: public base
};
在上面的示例中,因為我們可以訪問base類的源**,所以如果需要,我們可以直接向base新增功能。
有時我們可以訪問基類但不想修改它。考慮剛剛從第三方**商處購買**庫但需要一些額外功能的情況。您可以新增到原始**,但這不是最佳解決方案。如果**商向您傳送更新怎麼辦?您的新增內容將被覆蓋,或者您必須手動將其新增到更新中,這既費時又有風險。
或者,有時甚至不可能修改基類。考慮標準庫中的**。我們無法修改標準庫中的**。但是我們能夠從這些類繼承,然後將我們自己的功能新增到派生類中。對於第三方庫,您也可以使用標題,但**是預編譯的。
在任何一種情況下,最好的答案是派生自己的類,並將所需的功能新增到派生類。
base類中的乙個明顯遺漏是public訪問m_value的一種方式。我們可以通過在base類中新增乙個訪問函式來解決這個問題 - 但是為了示例,我們將把它新增到派生類中。由於m_value已在base類中宣告為受保護,因此derived可以直接訪問它。
要向派生類新增新功能,只需在派生類中宣告該功能,就像正常一樣:
現在公眾將能夠在derived型別的物件上呼叫getvalue()來訪問m_value的值。class derived: public base
int getvalue()
};
這會產生結果:int main()
derived has value 5
雖然可能很明顯,但base型別的物件無法訪問derived中的getvalue()函式。以下不起作用:
這是因為base中沒有getvalue()函式。函式getvalue()屬於derived。因為derived是base派生類,所以derived可以訪問base中的內容。但是,base無法訪問derived中的任何內容。int main()
C 基礎教程物件導向(學習筆記5(2))
在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...
C 基礎教程物件導向(學習筆記(23))
過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...
C 基礎教程物件導向(學習筆記(24))
過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...