C++ 中的繼承方式有哪些?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比永濟(jì)網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式永濟(jì)網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋永濟(jì)地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。基類(lèi)成員對(duì)派生類(lèi)的可見(jiàn)性對(duì)派生類(lèi)來(lái)說(shuō),基類(lèi)的公有成員和保護(hù)成員可見(jiàn),基類(lèi)的公有成員和保護(hù)成員作為派生類(lèi)的成員時(shí),它們都保持原有的狀態(tài);基類(lèi)的私有成員不可見(jiàn),基類(lèi)的私有成員仍然是私有的,派生類(lèi)不可訪問(wèn)基類(lèi)中的私有成員。
基類(lèi)成員對(duì)派生類(lèi)對(duì)象的可見(jiàn)性對(duì)派生類(lèi)對(duì)象來(lái)說(shuō),基類(lèi)的公有成員是可見(jiàn)的,其他成員是不可見(jiàn)的。
所以,在公有繼承時(shí),派生類(lèi)的對(duì)象可以訪問(wèn)基類(lèi)中的公有成員,派生類(lèi)的成員函數(shù)可以訪問(wèn)基類(lèi)中的公有成員和保護(hù)成員。
簡(jiǎn)單來(lái)說(shuō),派生類(lèi)能訪問(wèn)基類(lèi)的public, protected成員,繼承過(guò)來(lái)權(quán)限不變,派生類(lèi)對(duì)象只能訪問(wèn)基類(lèi)public成員。
測(cè)試代碼如下:
class A { private: int m_data1; void print1() { cout << "private print1" << endl; } protected: int m_data2; void print2() { cout << "protected print2" << endl; } public: A(int x = 1, int y = 2, int z = 3) : m_data1(x), m_data2(y), m_data3(z) {} int m_data3; void print3() { cout << "protected print3" << endl; } }; class B : public A { public: void test_public() { cout << m_data3 << endl; print3(); } void test_protected() { cout << m_data2 << endl; print2(); } void test_private() { // 下面兩行編譯不過(guò),B類(lèi)內(nèi)無(wú)法訪問(wèn)父類(lèi)的私有成員 // cout << m_data1 << endl; // print1(); } }; int main(int argc, char const* argv[]) { B b; b.test_public(); b.test_protected(); b.test_private(); cout << b.m_data3 << endl; // cout << b.m_data2 << endl; // 編譯不過(guò),子類(lèi)對(duì)象無(wú)法訪問(wèn)父類(lèi)protected的成員 // cout << b.m_data1 << endl; // 編譯不過(guò),子類(lèi)對(duì)象無(wú)法訪問(wèn)父類(lèi)private的成員 return 0; }
基類(lèi)成員對(duì)其對(duì)象的可見(jiàn)性與一般類(lèi)及其對(duì)象的可見(jiàn)性相同,公有成員可見(jiàn),其他成員不可見(jiàn)
基類(lèi)成員對(duì)派生類(lèi)的可見(jiàn)性對(duì)派生類(lèi)來(lái)說(shuō),基類(lèi)的公有成員和保護(hù)成員是可見(jiàn)的,基類(lèi)的公有成員和保護(hù)成員都作為派生類(lèi)的私有成員,并且不能被這個(gè)派生類(lèi)的子類(lèi)所訪問(wèn);基類(lèi)的私有成員是不可見(jiàn)的,派生類(lèi)不可訪問(wèn)基類(lèi)中的私有成員。
基類(lèi)成員對(duì)派生類(lèi)對(duì)象的可見(jiàn)性對(duì)派生類(lèi)對(duì)象來(lái)說(shuō),基類(lèi)的所有成員都是不可見(jiàn)的。所以,在私有繼承時(shí),基類(lèi)的成員只能由直接派生類(lèi)訪問(wèn),而無(wú)法再往下繼承。
簡(jiǎn)單來(lái)說(shuō)派生類(lèi)可以訪問(wèn)基類(lèi)的public, protected成員,繼承過(guò)來(lái)之后變成自己私有的。 派生類(lèi)的對(duì)象啥都不能訪問(wèn)。
class A { private: int m_data1; void print1() { cout << "private print1" << endl; } protected: int m_data2; void print2() { cout << "protected print2" << endl; } public: A(int x = 1, int y = 2, int z = 3) : m_data1(x), m_data2(y), m_data3(z) {} int m_data3; void print3() { cout << "protected print3" << endl; } }; class B : private A { public: void test_public() { cout << m_data3 << endl; print3(); } void test_protected() { cout << m_data2 << endl; print2(); } void test_private() { // 下面兩行編譯不過(guò),B類(lèi)內(nèi)無(wú)法訪問(wèn)父類(lèi)的私有成員 // cout << m_data1 << endl; // print1(); } }; int main(int argc, char const* argv[]) { B b; b.test_public(); b.test_protected(); b.test_private(); // cout << b.m_data3 << endl; // // 編譯不過(guò),子類(lèi)對(duì)象無(wú)法訪問(wèn)父類(lèi)public的成員 // cout << b.m_data2 << endl; // 編譯不過(guò),子類(lèi)對(duì)象無(wú)法訪問(wèn)父類(lèi)protected的成員 // cout << b.m_data1 << endl; // 編譯不過(guò),子類(lèi)對(duì)象無(wú)法訪問(wèn)父類(lèi)private的成員 return 0; }
基類(lèi)成員對(duì)派生類(lèi)的可見(jiàn)性對(duì)派生類(lèi)來(lái)說(shuō),基類(lèi)的公有成員和保護(hù)成員是可見(jiàn)的,基類(lèi)的公有成員和保護(hù)成員都作為派生類(lèi)的保護(hù)成員,并且不能被這個(gè)派生類(lèi)的子類(lèi)的對(duì)象所訪問(wèn),但可以被派生類(lèi)的子類(lèi)所訪問(wèn);基類(lèi)的私有成員是不可見(jiàn)的,派生類(lèi)不可訪問(wèn)基類(lèi)中的私有成員。
基類(lèi)成員對(duì)派生類(lèi)對(duì)象的可見(jiàn)性對(duì)派生類(lèi)對(duì)象來(lái)說(shuō),基類(lèi)的所有成員都是不可見(jiàn)的。
簡(jiǎn)單來(lái)說(shuō): 派生類(lèi)可以訪問(wèn)基類(lèi)的public, protected,繼承過(guò)來(lái)都變成了protected,派生類(lèi)對(duì)象啥都不能訪問(wèn)。
對(duì)于這三種方式繼承的派生類(lèi)來(lái)說(shuō): 都能訪問(wèn)基類(lèi)的public, protected 成員;
public 的方式繼承到派生類(lèi),這些成員的權(quán)限和在基類(lèi)里的權(quán)限保持一致;
protected方式繼承到派生類(lèi),成員的權(quán)限都變?yōu)閜rotected;
private 方式繼承到派生類(lèi),成員的權(quán)限都變?yōu)閜rivate;
對(duì)于三種方式派生類(lèi)的對(duì)象來(lái)說(shuō): 只有public的方式繼承后,派生來(lái)的對(duì)象只能訪問(wèn)基類(lèi)的public成員,protected和private方式繼承,派生類(lèi)的對(duì)象都不可以訪問(wèn)父類(lèi)的成員。
例: 請(qǐng)考慮標(biāo)記為A到J的語(yǔ)句在編譯時(shí)可能出現(xiàn)的情況。
#include<iostream> #include<cstdio> class Parent { public: Parent(int var=-1) { m_nPub = var; m_nPtd = var; m_bPrt = var; } int m_nPub; protected: int m_nPtd; private: int m_nPrt; }; class Child1 : public Parent { public: int GetPub() { return m_nPub; } int GetPtd() { return m_nPtd; } int GetPrt() { return m_nPrt; } // A }; class Child2 : protected Parent { public: int GetPub() { return m_nPub; } int GetPtd() { return m_nPtd; } int GetPrt() { return m_nPrt; } // B }; class Child3 : private Parent { public: int GetPub() { return m_nPub; } int GetPtd() { return m_nPtd; } int GetPrt() { return m_nPrt; } // C }; int main(int argc, char const *argv[]) { Child1 cd1; Child2 cd2; Child3 cd3; int nVar = 0; // public inherited cd1.m_nPub = nVar; // D cd1.m_nPtd = nVar; // E nVar = cd1.GetPtd(); // F // protected inherited cd2.m_nPub = nVar; // G nVar = cd2.GetPtd(); // H // private inherited cd3.m_nPub = nVar; // I nVar = cd3.GetPtd(); // J return 0; }
A, B, C都錯(cuò)誤,因?yàn)?m_nPrt 是父類(lèi)的private變量,子類(lèi)不能訪問(wèn)。
D正確。 cdl是公有繼承,可以訪問(wèn)并改變父類(lèi)的公有變量。
E 錯(cuò)誤。 m_nPtd 是父類(lèi) Parent 的保護(hù)變量,不可以被公有繼承的 cdl 訪問(wèn), 更不可以被修改。 雖然 m_nPtd 是父類(lèi) Parent 的保護(hù)變量,經(jīng)過(guò)公有繼承后, m_nPtd 在子類(lèi)中依然是protected, 而子類(lèi)的對(duì)象cdl是不能訪問(wèn)自身的protected成員,只能訪問(wèn)public成員。
F正確。派生類(lèi)內(nèi)可以訪問(wèn)父類(lèi)的保護(hù)變量。
G錯(cuò)誤。cd2是保護(hù)繼承的,派生類(lèi)對(duì)象不能訪問(wèn)父類(lèi)成員。
H正確。派生類(lèi)內(nèi)可以訪問(wèn)父類(lèi)的保護(hù)變量。
I錯(cuò)誤。cd2是私有繼承的,派生類(lèi)對(duì)象不能訪問(wèn)父類(lèi)成員。
J正確。派生類(lèi)內(nèi)可以訪問(wèn)父類(lèi)的保護(hù)變量。
關(guān)于C++ 中的繼承方式有哪些問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
網(wǎng)站題目:C++中的繼承方式有哪些-創(chuàng)新互聯(lián)
分享地址:http://muchs.cn/article20/coegjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、App開(kāi)發(fā)、靜態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、網(wǎng)站內(nèi)鏈、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容