ideajava目录显示类成员_面试:C++不可继承类
作者:wxquare
鏈接:https://www.cnblogs.com/wxquare/p/7280025.html
面試中可能遇到讓設計一個無法被繼承的類。最簡單的實現是將該類的構造函數設置為私有的,然后通過靜態成員函數調用私有構造函數實例化對象,這樣的類確實不可繼承,但是使用起來非常不方便,必須使用靜態成員實例化對象,而且對象存儲在堆中,無法像一個普通的類一樣的被使用。最佳的設計是結合私有構造函、友元、虛擬繼承實現。
一、簡單實現
class?Simple{private:
????Simple(){};
????~Simple(){}
private:
????static?Simple*?getInstance(){
????????return?new?Simple();
????}
????static?void?deleteInstance(Simple*?instance){
????????delete?instance;
????}
};
二、最佳實現
template<typename?T>class?NoneInherit?{
????friend?T;
private:
????NoneInherit()?{
????}
????~NoneInherit()?{
????}
};
class?Finalclass:?virtual?public?NoneInherit?{public:
????Finalclass()?{
????}
????~Finalclass()?{
????}
};//class?TestClass:?public?Finalclass?{//};
關鍵點:
模板類NoneInherit類,構造函數和析構函數都設置為私有,模板參數T設置為友元,這樣友元類可以調用構造函數。例如FinalClass是NoneInherit的友元類,可以使用基類的私有構造函數和析構函數
虛擬繼承virtual是最關鍵的點。如果繼承時去掉virtual,FinalClass還是可以被繼承的,那么為什么需要使用虛擬繼承呢?因為在普通繼承中,每個類只是初始化自己的直接的基類。那意味著,如果不使用virtual,TestClass繼承Finalclass,由FinalClass再去調用NoneInherit類,由于FinalClass是NoneInHerit的基類,因此整個繼承沒有任何問題。由于FinalClass使用了虛擬繼承,在創建TestClass的時候,TestClass類的構造函數要負責虛基類NoneInherit類的構造,而NoneInherit的構造函數是私有的,友元關系也無法繼承,因此TestClass類沒有訪問的權限。
●編號483,輸入編號直達本文
●輸入m獲取文章目錄
C語言與C++編程分享C/C++技術文章
總結
以上是生活随笔為你收集整理的ideajava目录显示类成员_面试:C++不可继承类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 释放数组_java集合Arra
- 下一篇: cocos2d c 调用java_coc