我們?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 <iostream>
#include <string>
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 <iostream>
#include <string>
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 <iostream>
#include <string>
#include <sstream>
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。
本文名稱:繼承中的訪問級(jí)別(三十七)
標(biāo)題網(wǎng)址:http://www.yijiale78.com/article0/gcedio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、做網(wǎng)站、外貿(mào)建站、企業(yè)網(wǎng)站制作、小程序開發(fā)
聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)