1. 現実場景
在很多電影電視劇里,武功最高的往往是太監,所謂“欲練此功,必先自宮”,太監的武功為什么會這么高?我想應該是閑的。如果說面向對象的世界里有父子的話,那么太監這個類應該就是無法生子的類。他們是無法被繼承的,不過,他們是可以繼承別人的。
2. 技術問題
要實現一個無法被繼承的類,Java為我們提供了一個關鍵字final,但是C++里沒有,那作為C++程序員如何寫出一個無法被繼承的類呢?構造函數和析構函數。
為什么C++的構造函數和析構函數能夠實現這點呢?因為C++的類繼承里有一個規則,就是子類在實例化的時候,必須先調用父類的構造函數。對象銷毀的時候,也必須調用父類的析構函數。所以如果我們能阻止子類調用父類的構造函數和析構函數就可以了。
那如何讓一個類的構造函數和析構函數不被子類調用呢?private權限。是的,private權限的成員和函數都只能給類自己內部用。這樣的話,就可以實現我們要的無法被繼承的類了。
下面就看我們實現的代碼是什么樣的吧!
1 #include <iostream> 2 using namespace std; 3 4 class Taijian{ 5 public: 6 void publicFunc(){ 7 8 } 9 10 private: 11 Taijian(){} 12 ~Taijian(){} 13 }; 14 15 int main(){ 16 return 0; 17 }
對Taijian類,如果你試圖去繼承它,那是通不過編譯階段的。
3. 補充
關於C++的類在發生繼承時,它們的構造函數和析構函數的調用次序是怎樣的呢?
構造函數:爺爺構造函數 → 父親構造函數 → 兒子構造函數
析構函數:兒子析構函數 → 父親析構函數 → 爺爺析構函數
