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