先寫最基礎(chǔ)的吧绅这。
C進(jìn)入C++最先碰到的就是class赔桌,跟structure很像瓢剿,但是一開始就多了幾個(gè)關(guān)鍵字public,private和protected帘睦。
下面就我目前自己的理解來說一說袍患。
這幾個(gè)關(guān)鍵都是修飾class內(nèi)部成員的訪問權(quán)限,簡單的理解就是:
- 這些都是我的東西竣付,你想要的話诡延,是可以直接拿呢;還是需要我給你一把鑰匙先古胆?
- 能直接拿的肆良,那就是public成員筛璧。
- 需要鑰匙的,那就是private或者protected成員惹恃。
不過實(shí)際用起來夭谤,我理解可以分成兩種case:
1. 聲明class時(shí),修飾內(nèi)部成員屬性
看一段code:
#include<iostream>
#include<assert.h>
using namespace std;
class A{
public:
int a;
A() {
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun() {
cout << a << endl; // 在類內(nèi)部訪問巫糙,正確
cout << a1 << endl; // 內(nèi)部訪問朗儒,正確
cout << a2 << endl; // 內(nèi)部訪問,正確
cout << a3 << endl; // 內(nèi)部訪問参淹,正確
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
int main() {
A itema;
itema.a = 10; // 在類外部訪問public成員a醉锄,正確
itema.a1 = 20; // 在類外部訪問public成員a1,正確
itema.a2 = 30; // 在類外部訪問protected成員a2浙值,錯(cuò)誤恳不,類外不能訪問protected成員
itema.a3 = 40; // 在類外部訪問private成員a3,錯(cuò)誤亥鸠,類外不能訪問private成員
system("pause");
return 0;
}
由注釋可以看到妆够,通過不同的關(guān)鍵字修飾的類成員识啦,其訪問權(quán)限就有了區(qū)別负蚊。
小結(jié)一下:
- public成員可以在類外部被訪問。
- private成員只屬于類自己颓哮,外部想訪問private成員家妆,只能通過類方法。
- protected成員目前的訪問屬性與private成員一樣
2. 類繼承時(shí)冕茅,使基類成員屬性在派生類中發(fā)生變化
類如果不發(fā)生派生伤极,好像就看不出protected和private的區(qū)別的,別慌姨伤,繼續(xù)往下走哨坪。
因?yàn)槭?個(gè)關(guān)鍵字,所以就有了3種繼承方式:
2.1 public繼承
剛開始乍楚,我是我爸爸生的当编,我想各方面都跟我爹保持一致,我不想對父類的各個(gè)成員屬性作任何改變徒溪,那么忿偷,我就用public繼承。
還是看code和注釋一目了然:
#include<iostream>
#include<assert.h>
using namespace std;
class A {
public:
int a;
A() {
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun() {
cout << a << endl; // 訪問public成員a臊泌,正確
cout << a1 << endl; // 訪問public成員a1鲤桥,正確
cout << a2 << endl; // 類成員函數(shù)訪問protected成員a2,正確
cout << a3 << endl; // 類成員函數(shù)訪問private成員a3渠概,正確
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
// 類B public繼承 類A茶凳,所以,B繼承了A的成員a1,a2贮喧,屬性也完全一樣(注:B無法繼承A的private成員a3)
class B : public A {
public:
int a;
B(int i) {
A();
a = i;
}
void fun() {
cout << a << endl; // 正確顷牌,訪問自己的public成員
cout << a1 << endl; // 正確,基類的public成員塞淹,在派生類中仍是public成員窟蓝。
cout << a2 << endl; // 正確,基類的protected成員饱普,在派生類中仍是protected,并且可以被派生類訪問运挫。
cout << a3 << endl; // 錯(cuò)誤,基類的private成員不能被派生類訪問套耕。(private成員只能由本類的成員訪問)
}
};
int main() {
B b(10);
cout << b.a << endl;
cout << b.a1 << endl; // 正確谁帕,類外可以訪問b的public成員a1
cout << b.a2 << endl; // 錯(cuò)誤,類外不能訪問protected成員a2
cout << b.a3 << endl; // 錯(cuò)誤冯袍,類外不能訪問private成員
system("pause");
return 0;
}
小結(jié)一下:
- public繼承出來的派生類匈挖,基類的成員屬性在派生類中不會(huì)發(fā)生任何變化。
- 派生類無法訪問基類的private成員康愤。(我理解為:派生類無法繼承基類的private成員儡循,因此派生類就沒有這個(gè)成員,自然也就無法訪問)
- 派生類可以繼承基類的protected成員征冷,并且在派生類中择膝,仍然是protected屬性。
2.2 protected繼承
OK检激,龍生九子肴捉,總有熊孩子。雖然我是我爸爸生出來的叔收,但我爸當(dāng)年讓你直接隨便拿的一些東西(蒼老師教學(xué)片)齿穗,在我這兒,我不想讓你直接取了(我要私藏起來饺律,鎖抽屜里窃页,隱私,懂不懂@渡埂腮出?),我想變一下芝薇,那咋辦胚嘲?
那好辦,C++就是這點(diǎn)好,你想要的洛二,它都能給你 : )
那我們就不public繼承了嘛馋劈,關(guān)鍵字不是還有2個(gè)嗎攻锰,protected也可以用?
那當(dāng)然了妓雾,請看code:
#include<iostream>
#include<assert.h>
using namespace std;
class A {
public:
int a;
A() {
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun() {
cout << a << endl; // 正確娶吞,自己的方法訪問自己的成員
cout << a1 << endl; //正確
cout << a2 << endl; //正確
cout << a3 << endl; //正確
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
// B protected繼承 A,那么A的public成員械姻,在B中就“降級”變成protected妒蛇,protected和private成員屬性不變
class B : protected A {
public:
int a;
B(int i) {
A();
a = i;
}
void fun() {
cout << a << endl; //正確,B自己的public成員楷拳。
cout << a1 << endl; //正確绣夺,基類的public成員,在派生類中變成了protected欢揖,可以被派生類訪問陶耍。
cout << a2 << endl; //正確,基類的protected成員她混,在派生類中還是protected烈钞,可以被派生類訪問。
cout << a3 << endl; //錯(cuò)誤坤按,基類的private成員不能被派生類訪問毯欣。
}
};
int main() {
B b(10);
cout << b.a << endl; //正確,對象b自己的的public成員a
cout << b.a1 << endl; //錯(cuò)誤晋涣,b.a1這時(shí)候是protected屬性仪媒,protected成員不能在類外訪問。
cout << b.a2 << endl; //錯(cuò)誤谢鹊,protected成員不能在類外訪問。
cout << b.a3 << endl; //錯(cuò)誤留凭,private成員不能在類外訪問佃扼。
system("pause");
return 0;
}
你看,這樣蔼夜,爸爸的public片片兼耀,在兒子這里,就鎖起來了吧求冷!
小結(jié)一下:
- protected繼承出的派生類瘤运,基類的成員屬性在派生類中會(huì)發(fā)生改變。
- 基類的public成員匠题,在派生類中被“降級”成protected拯坟。
- 基類的protected成員,在派生類中仍然是protected韭山。
- 基類的private成員郁季,派生類依然無法訪問冷溃。
2.3 private繼承
來到最后一個(gè)關(guān)鍵字private。
沒有最熊梦裂,只有更熊的娃似枕。我爸讓你能直接看的所有東西,現(xiàn)在到我這兒年柠,對不起凿歼,我都不想再讓你直接看了;并且冗恨,我還不想給我的兒子繼承了R阃(蒼老師只屬于我,自己親兒子也別想E山)
那要達(dá)到這樣的效果攀唯,就需要private繼承了。
看code:
#include<iostream>
#include<assert.h>
using namespace std;
class A{
public:
int a;
A() {
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun() {
cout << a << endl; //正確
cout << a1 << endl; //正確
cout << a2 << endl; //正確
cout << a3 << endl; //正確
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
// B private繼承 A渴丸,那么在B里侯嘀,A的public和protected成員都變成了B的private成員
class B : private A {
public:
int a;
B(int i) {
A();
a = i;
}
void fun() {
cout << a << endl; //正確,內(nèi)部訪問public成員a谱轨。
cout << a1 << endl; //正確戒幔,基類public成員,在派生類中變成了private,可以被派生類訪問。
cout << a2 << endl; //正確土童,基類的protected成員诗茎,在派生類中變成了private,可以被派生類訪問献汗。
cout << a3 << endl; //錯(cuò)誤敢订,基類的private成員不能被派生類訪問。
}
};
int main(){
B b(10);
cout << b.a << endl; //正確罢吃。b.a是b的public成員
cout << b.a1 << endl; //錯(cuò)誤楚午,private成員不能在類外訪問。
cout << b.a2 << endl; //錯(cuò)誤, private成員不能在類外訪問尿招。
cout << b.a3 << endl; //錯(cuò)誤矾柜,private成員不能在類外訪問。
system("pause");
return 0;
}
再次小結(jié)一下:
- private繼承后就谜,基類的public和protected成員怪蔑,在派生類里都被“降級”成private。
- 訪問派生類的private成員丧荐,自然遵循private規(guī)則缆瓣。
- 如果有派生類再派生“孫子”類,那么這個(gè)“孫子”類將無法訪問“爺爺”類和“父親”類中的任何private成員篮奄。
好啦捆愁,今天就碼到這里割去,第一次寫技術(shù)文字,獻(xiàn)丑獻(xiàn)丑昼丑,有謬誤之處,請不吝指教菩帝,多謝多謝~