1. 程式人生 > >public,private,protected的區別,繼承方法與訪問許可權

public,private,protected的區別,繼承方法與訪問許可權

訪問範圍:

private: 只能由該類中的函式、其友元函式訪問,不能被任何其他訪問,該類的物件也不能訪問. 
protected: 可以被該類中的函式、子類的函式、以及其友元函式訪問,但不能被該類的物件訪問 
public: 可以被該類中的函式、子類的函式、其友元函式訪問,也可以由該類的物件訪問

注:友元函式包括兩種:設為友元的全域性函式,設為友元類中的成員函式

父類與其直接子類的訪問關係如上,無論是哪種繼承方式(private繼承、protected繼承、public繼承)。

對於三種繼承關係的不同:

public繼承:public繼承後,從父類繼承來的函式屬性不變(private、public、protected屬性不變,)。

private繼承:private繼承後,從父類繼承來的函式屬性都變為private

protected繼承:protected繼承後,從父類繼承過來的函式,public、protected屬性變為protected,private還是private。

程式碼:定義了一個父類CFather,三個子類(CSonPrivate、CSonPublic、CSonProtected),三個孫子類(CGrandsonFromPrivate、CGrandsonFromProtected、CGrandsonFromPublic)

父類CFather:

class CFather  
{
public:
CFather();
virtual ~CFather();


void FuncFatherPublic()
{
printf("FuncFatherPublic\r\n");
}
protected:
void FuncFatherProtected()
{
printf("FuncFatherProtected\r\n");
}
private:
void FuncFatherPrivate()
{
printf("FuncFatherPrivate\r\n");
}


};

子類CSonPrivate:

class CSonPrivate : private CFather  
{
public:
CSonPrivate();
virtual ~CSonPrivate();
void FuncSonPrivatePublic()
{
printf("FuncSonPrivatePublic\r\n");
}
void FuncSonTestCall()
{
FuncFatherPublic();
FuncFatherProtected();
//FuncFatherPrivate();//錯誤,父類私有函式不可呼叫
}
protected:
void FuncSonPrivateProtected()
{
printf("FuncSonPrivateProtected\r\n");
}
private:
void FuncSonPrivatePrivate()
{
printf("FuncSonPrivatePrivate\r\n");
}


};

子類CSonProtected:

#include "Father.h"


class CSonProtected : protected CFather  
{
public:
CSonProtected();
virtual ~CSonProtected();
void FuncSonProtectedPublic()
{
printf("FuncSonProtectedPublic\r\n");
}
void FuncSonTestCall()
{
FuncFatherPublic();
FuncFatherProtected();
//FuncFatherPrivate();//錯誤,父類私有函式不可呼叫
}
protected:
void FuncSonProtectedProtected()
{
printf("FuncSonProtectedProtected\r\n");
}
private:
void FuncSonProtectedPrivate()
{
printf("FuncSonProtectedPrivate\r\n");
}


};

子類CSonPublic:

#include "Father.h"


class CSonPublic:public CFather 
{
public:
CSonPublic();
virtual ~CSonPublic();
void FuncSonPublicPublic()
{
printf("FuncSonPublicPublic\r\n");
}
void FuncSonTestCall()
{
FuncFatherPublic();
FuncFatherProtected();
//FuncFatherPrivate();//錯誤,父類私有函式不可呼叫
}
protected:
void FuncSonPublicProtected()
{
printf("FuncSonPublicProtected\r\n");
}
private:
void FuncSonPublicPrivate()
{
printf("FuncSonPublicPrivate\r\n");
}


};

孫子類CGrandsonFromPrivate:

#include "SonPrivate.h"


class CGrandsonFromPrivate : public CSonPrivate  
{
public:
CGrandsonFromPrivate();
virtual ~CGrandsonFromPrivate();
void FuncSonTestCall()
{
//FuncFatherPublic();//祖父類的公共函式被父類私有繼承後屬性變為private,因此也不能在外部或其子類中訪問
//FuncFatherProtected();//祖父類的保護函式被父類私有繼承後屬性變為private,因此也不能在外部或其子類中訪問
//FuncFatherPrivate();//祖父類的私有函式不可訪問
}


};

孫子類CGrandsonFromProtected:

class CGrandsonFromProtected : public CSonProtected  
{
public:
CGrandsonFromProtected();
virtual ~CGrandsonFromProtected();


void FuncSonTestCall()
{
FuncFatherPublic();//父類protected繼承祖父類,祖父類的public函式屬性變成protected
FuncFatherProtected();//父類protected繼承祖父類,祖父類的protected函式屬性還是protected
//FuncFatherPrivate();//祖父類的私有函式不可訪問
}


};

孫子類CGrandsonFromPublic:

#include "SonPublic.h"


class CGrandsonFromPublic : public CSonPublic  
{
public:
CGrandsonFromPublic();
virtual ~CGrandsonFromPublic();
void FuncSonTestCall()
{
FuncFatherPublic();//父類public繼承祖父類,祖父類的public函式屬性還是public
FuncFatherProtected();//父類public繼承祖父類,祖父類的protected函式屬性還是protected
//FuncFatherPrivate();//祖父類的私有函式不可訪問
}


};

main函式:

int main(int argc, char* argv[])
{
CGrandsonFromProtected grandson_fromprotected;
//grandson_fromprotected.FuncFatherPublic();//錯誤,經過protected繼承後,public變為protected
return 0;
}