我們?cè)谏掀┛椭薪榻B了 C++ 中的繼承,那么我們想想既然是繼承了,子類是否可以直接訪問父類中的私有成員呢?根據(jù)面向?qū)ο罄碚?/strong>:子類擁有父類的一切屬性和行為,自然子類也就能直接訪問父類的私有成員!但是根據(jù) C++ 語法:外界不能直接訪問類的 private 成員,因此子類就不能直接訪問父類的私有成員!那么到底哪種是正確的呢?我們來編程實(shí)驗(yàn)下
瑪沁ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
#include#include using namespace std; class Parent { int mv; public: Parent() { mv = 100; } int value() { return mv; } }; class Child : public Parent { public: int addValue(int v) { mv = mv + v; } }; int main() { return 0; }
我們來編譯下看看是否可以通過
編譯報(bào)錯(cuò)了,說明我們的第二種分析是正確的。那么不是說繼承可以獲得父類的全部資源嘛,它的私有成員在子類中就不能被訪問。接下來我們就要介紹一個(gè)概念了,在面向?qū)ο笾械脑L問級(jí)別不只是 public 和 private,還有個(gè) protected訪問級(jí)別。那么 protected 關(guān)鍵字的意義是什么呢?被它修飾的成員不能被外界直接訪問,但是它修飾的成員可以被子類直接訪問。接下來我們體驗(yàn)下 protected 。
#include#include using namespace std; class Parent { protected: int mv; public: Parent() { mv = 100; } int value() { return mv; } }; class Child : public Parent { public: int addValue(int v) { mv = mv + v; } }; int main() { Parent p; cout << "p.mv = " << p.value() << endl; Child c; cout << "c.mv = " << c.value() << endl; c.addValue(50); cout << "c.mv = " << c.value() << endl; return 0; }
我們來試下將 private 屬性換成 protected,看看編譯可以通過嗎?
我們看到編譯通過了,也正常運(yùn)行了。那么我們?cè)?main 函數(shù)中直接給 p.mv 和 c.mv 賦值為 1000 呢?我們看看編譯結(jié)果
我們看到編譯失敗了,因?yàn)槌蓡T變量 mv 是 protected 的,所以在外界不能直接訪問。那么為什么在面向?qū)ο笾行枰?protected 呢?我們來想想現(xiàn)實(shí)生活中,比如小明要去醫(yī)院看病。有些隱秘的病史,小明肯定不想讓別人知道,但是這時(shí)必須得給醫(yī)生坦白,不然沒法治病哈。這時(shí)便有了 protected 這個(gè)需求了,這個(gè)病史不是純私有的,但又不是暴露在大眾之下的。我們面向?qū)ο蟮乃枷胫校瑸榱烁昝赖馁N合生活,便有了 protected 這個(gè)關(guān)鍵字。那么我們?cè)诙x類時(shí)訪問級(jí)別是怎樣選擇的呢?我們來看看下面這張表。注:表是由唐長(zhǎng)老總結(jié)出來的!
關(guān)系已經(jīng)很明確了,我就不多廢話了。下來我們來看個(gè)示例,關(guān)系如下
用程序描述出來就是下面這
#include#include #include using namespace std; class Object { protected: string mName; string mInfo; public: Object() { mName = "Object"; mInfo = ""; } string name() { return mName; } string info() { return mInfo; } }; class Point : public Object { private: int mX; int mY; public: Point(int x = 0, int y = 0) { ostringstream s; mX = x; mY = y; mName = "Point"; s << "P(" << mX << ", " << mY << ")"; mInfo = s.str(); } int x() { return mX; } int y() { return mY; } }; class Line : public Object { private: Point mP1; Point mP2; public: Line(Point p1, Point p2) { ostringstream s; mP1 = p1; mP2 = p2; mName = "Line"; s << "Line form " << mP1.info() << " to " << mP2.info() << "!"; mInfo = s.str(); } Point begin() { return mP1; } Point end() { return mP2; } }; int main() { Object o; Point p(1, 2); Point pn(5, 6); Line l(p, pn); cout << o.name() << endl; cout << o.info() << endl; cout << endl; cout << p.name() << endl; cout << p.info() << endl; cout << endl; cout << l.name() << endl; cout << l.info() << endl; return 0; }
我們看看編譯結(jié)果
我們看到在 Object 類中沒有相應(yīng)的描述,所以它的信息為空,別的打印是正確的。通過對(duì)繼承中的訪問級(jí)別的學(xué)習(xí),總結(jié)如下:1、面向?qū)ο笾械脑L問級(jí)別不只是 public 和 private;2、protected 修飾的成員不能被外界訪問,它使得子類能夠訪問父類的成員;3、protected 關(guān)鍵字是為了繼承而專門設(shè)計(jì)的;4、沒有 protected 就無法完成真正意義上的代碼復(fù)用。
歡迎大家一起來學(xué)習(xí) C++ 語言,可以加我QQ:243343083。