【C++】继承
繼承(inheritance)機(jī)制是面向?qū)ο蟪?/span>序設(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能。這樣產(chǎn)生新的類,稱派生類(子類),被繼承的類稱為基類(父類,現(xiàn)在還有一種叫法交超類)。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu)。體現(xiàn)了由簡單到復(fù)雜的認(rèn)識(shí)過程。
繼承的方式有三種:公有繼承,私有繼承,保護(hù)繼承,那么這三種繼承方式有什么不同呢?
我們結(jié)合監(jiān)視框可以看出上述圖中代碼所創(chuàng)建對(duì)象的內(nèi)存結(jié)構(gòu):下圖說明了我們派生類繼承基類的之后,創(chuàng)建對(duì)象的時(shí)候?qū)⒒惖乃谐蓡T變量當(dāng)個(gè)zheng'ge
?
無論是私有繼承,公有繼承,還是保護(hù)繼承,在對(duì)于派生類的成員函數(shù)來說的話,只有在基類的private的成員變量在派生類中是不可見的。
公有繼承、私有繼承和保護(hù)繼承對(duì)成員函數(shù)的影響:
class A
{
public: int ax;
protected: int ay;
private: int az;
public:A() { ax = ay = az = 0; }
};class B :public A
{
public: int bx;
protected: int by;
private: int bz;
public:B() { bx = by = bz = 3; }void fun() { ax = 10; ay = 20; az = 30; }
};int main()
{B b;return 0;
}
public:
?private:
?protected:
?繼承對(duì)外部函數(shù)的影響:
class A
{
public: int ax;
protected: int ay;
private: int az;
public:A() { ax = ay = az = 0; }
};class B :public A
{
public: int bx;A aa;
protected: int by;
private: int bz;
public:B() { bx = by = bz = 3; }
};int main()
{B b;return 0;
}
我們上述代碼中在派生類中構(gòu)建了一個(gè)public的基類A的對(duì)象,下面我們?cè)谕獠亢瘮?shù)main()這個(gè)外部函數(shù)中去調(diào)用:
派生類構(gòu)建public基類對(duì)象:
?由于公有繼承,我們可以訪問到A中的public成員,但是由于b是在外部函數(shù)中構(gòu)建的,所以我們不可以訪問到protected和private中的成員。
派生類構(gòu)建protected基類對(duì)象:
?基類對(duì)象aa由于在protected,所以外部函數(shù)不可訪問,外部函數(shù)只可以訪問自身public和基類public
派生類構(gòu)建private基類對(duì)象:
??基類對(duì)象aa由于在private,所以外部函數(shù)不可訪問,外部函數(shù)只可以訪問自身public和基類public
上面三種圖片分別顯示了在public繼承下,我們分別在public、protected和private下構(gòu)建基類對(duì)象,使用外部函數(shù)來進(jìn)行調(diào)用,可以看到只有在public下構(gòu)建基類對(duì)象我們外部函數(shù)才可以訪問。
還有在保護(hù)繼承和私有繼承就不測(cè)試了因?yàn)橥獠亢瘮?shù)不可訪問保護(hù)的私有的屬性,因此不可訪問!
那么如果我們想進(jìn)行訪問該怎么辦呢?-------------->使用友元friend,下面再來演示一下友元的使用:
?這樣我們就可以訪問他們的私有以及保護(hù)屬性的成員了。
“聞雞起舞”
總結(jié)
- 上一篇: 【C++】何时需要自定义拷贝构造函数和赋
- 下一篇: 【C++】虚函数