C++中的繼承模式深入詳解
前言
繼承是OOP設(shè)計中的重要概念。在C++語言中,派生類繼承基類有三種繼承方式:私有繼承(private)、保護繼承(protected)和公有繼承(public)。
一、繼承規(guī)則
繼承是C++中的重要特性,派生類可以訪問基類中的protected和public成員
先上代碼:
#include<iostream> using namespace std; class Base { private: void func_pri(); protected: void func_pro(); public: void func_pub(); }; void Base::func_pri() { cout << "private" << endl; } void Base::func_pro() { cout << "protected" << endl; } void Base::func_pub() { cout << "public" << endl; this->func_pri(); } class Derive:public Base { public: void function(); }; void Derive::function() { //func_pri();調(diào)用private成員會產(chǎn)生編譯錯誤 func_pro(); func_pub(); } int main() { Derive* derive; derive=new Derive; derive->function(); //output: //protected public private delete derive; return 0; }
醬在這里用一段簡單地代碼為大家說明了繼承的規(guī)則。派生類只能訪問基類的public和protected成員,無法訪問private成員;若要調(diào)用類中private成員,要在類內(nèi)部使用this指針傳參(關(guān)于this指針的用法,醬在后續(xù)文章中會為大家進一步整理)。這里Derive是public Base,是公有繼承。
上表:
二、繼承類型
首先要確立一個概念:無論是公有、私有還是保護繼承,說到底它們都屬于繼承,滿足繼承的基本規(guī)則(如上表)。無論是private、protected還是public,對于直接向基類繼承的派生類來說幾乎沒有影響(即俗稱的“子代”而非“孫子代”)。上面的代碼class Derive:public Base
換成private Base和protected Base
,結(jié)果都是一樣的。
影響的是派生類的繼承,即“孫子代”。
1.保護繼承
先上代碼:
#include<iostream> using namespace std; class Base { private: void func_pri(); protected: void func_pro(); public: void func_pub(); }; void Base::func_pri() { cout << "private" << endl; } void Base::func_pro() { cout << "protected" << endl; } void Base::func_pub() { cout << "public" << endl; this->func_pri(); } class Derive:protected Base { public: void function(); }; void Derive::function() { func_pro(); func_pub(); } class Derive_sec:public Derive { public: void func_sec(); }; void Derive_sec::func_sec() { func_pub(); func_pro(); //func_pri();調(diào)用這里時會產(chǎn)生錯誤 } int main() { Derive_sec* derive; derive=new Derive_sec; derive->func_sec(); delete derive; return 0; }
這段代碼運行后的結(jié)果是public protected。
可以看出的是Derive_sec類(子二代)可以調(diào)用的是Base基類的protected和public成員函數(shù),而無法調(diào)用private成員函數(shù)。
2.私有繼承
先上代碼:
#include<iostream> using namespace std; class Base { private: void func_pri(); protected: void func_pro(); public: void func_pub(); }; void Base::func_pri() { cout << "private" << endl; } void Base::func_pro() { cout << "protected" << endl; } void Base::func_pub() { cout << "public" << endl; this->func_pri(); } class Derive:private Base { public: void function(); }; void Derive::function() { func_pro(); func_pub(); } class Derive_sec:public Derive { public: void func_sec(); }; void Derive_sec::func_sec() { //func_pub();調(diào)用時會產(chǎn)生錯誤 //func_pro();調(diào)用時會產(chǎn)生錯誤 //func_pri();調(diào)用這里時會產(chǎn)生錯誤 function(); } int main() { Derive_sec* derive; derive=new Derive_sec; derive->func_sec(); delete derive; return 0; }
通過結(jié)果來看,Derive_sec類(子二代)對Base基類中private、protected和public的成員函數(shù)均不能調(diào)用,但其仍然可以調(diào)用子一代的公有函數(shù)。
總結(jié)
在三種模式的繼承中,我們可以看出當(dāng)子一代設(shè)置為公有繼承/保護繼承基類時,子二代對基類protected、public成員變量可以訪問,而對private變量不可訪問;當(dāng)子一代設(shè)置為私有繼承基類時,子二代對基類private、protected、public成員變量均不能訪問.
我們可以得出這樣的結(jié)論:當(dāng)基類和派生類具有直接繼承關(guān)系時,按照上文所述繼承規(guī)則即可;若派生類是經(jīng)過對基類的多重繼承得來的,則要考慮之前的繼承模式。
private繼承模式在對類之間的封裝性有要求時,可以考慮使用。
到此這篇關(guān)于C++中的繼承模式深入詳解的文章就介紹到這了,更多相關(guān)C++中的繼承模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu20.04安裝使用jsoncpp、json-c庫的方法實例
這篇文章主要給大家介紹了關(guān)于Ubuntu20.04安裝使用jsoncpp、json-c庫的相關(guān)資料,文中通過代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作就有一定的參考借鑒價值,需要的朋友可以參考下2024-04-04詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運算符重載的實現(xiàn)
本文主要為大家講解一下三個C++中的運算符重載,分別是賦值運算符重載、關(guān)系運算符重載和函數(shù)調(diào)用運算符重載,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06