c++的三種繼承方式:
public,private,protected.
(1)先從一個類說起:
class A{
private:
int i;
public:
void f(){
cout<<i<<endl;//這是可以的,類內(nèi)部的函數(shù)可以訪問它的私有成員。
}
private:
void g(){
cout<<i<<endl;//這也是可以的,類內(nèi)部的函數(shù)可以訪問它的私有成員,包括public,private,protected;
}
};
void main(){
A a;
//a.i;
//這是錯誤的,這個函數(shù)沒有權(quán)限訪問私有變量。
}
(2)
class A{
private:
int i;
};
void main(){
A a;
//a.i;
//這是錯誤的,這個函數(shù)沒有權(quán)限訪問私有變量。
}
(3)
class A{
private:
int i;
friend void main();//聲明main函數(shù)是這個類A的友員函數(shù)。
};
void main(){
A a;
a.i;
//這是正確的,友元函數(shù)有權(quán)限訪問類的私有成員變量。
}
(4)關(guān)于類的protected 成員變量。
class A{
protected:
int x;
};
class B:public A{
public:
void f1(){
cout<<x<<endl;
}
private:
void f2(){
cout<<x<<endl;
}
protected:
void f3(){
cout<<x<<endl;
}
}
//總結(jié):類B是從類A(public)繼承而來,
//類B的成員函數(shù)(包括 public,protected,private)都可以訪問類A的私有成員變量。
//其實類B可以從類A(protected,private)繼承,結(jié)果都一樣,它的成員函數(shù)都可以訪問類A的私有變量。
//!注意:是成員函數(shù)可以。
(5)接上面(4)
class A{
protected:
int x;
};
class B:public A{
public:
void f1(){
cout<<x<<endl;//可以
}
private:
void f2(){
cout<<x<<endl;//可以
}
protected:
void f3(){
cout<<x<<endl;//可以
}
}
void main(){
B b;
b.x=1;//不可以,結(jié)合上面(4)所說,是子類的成員函數(shù)可以,但是不能通過對象直接訪問。
}
(6)關(guān)于單個類的protected成員變量。
它在類內(nèi)部訪問屬性和私有成員一樣。
class A{
private:
int x;
protected:
int y;
public:
void f1(){
cout<<x<<y<<endl;//和私有成員變量一樣,可以訪問。
}
}
void main(){
A a;
cout<<a.x<<a.y<<endl;//和私有成員變量一樣,不可以這樣訪問。
}
(7)假設(shè)B類繼承A類,即B類是A類的直接子類。
public繼承:A的訪問屬性在B類保持不變。
A的public----------B仍是public;
A的protected-------B仍是protected;
A的private---------B仍是private;
protected繼承:
A的public----------B變成protected;
A的protected-------B仍是protected;
A的private---------B仍是private;
private繼承:
A的public----------B變成private;
A的protected-------B變成private;
A的private---------B仍是private;
//這里說的都是直接子類。
//結(jié)合(7)和以上幾點 各類的訪問權(quán)限,尤其是(protected修飾的)就可以明白
//C++繼承下各個類之間的訪問權(quán)限。
(8)備注:以上只設(shè)計單繼承。多繼承未作研究。