在C++中,子類繼承父類有三種繼承方式,分別是:public, protected和private。子類繼承的方式不同,那么子類對象訪問父類中的參數訪問權限也不同。
public 方式繼承:基類的private成員派生類不可見,基類中的protected和public成員在派生類中可以直接使用,並且變成了派生類中相應 的protected成員和public成員,但是只有public成員可以在派生類外使用。
protected 方式繼承:基類的private成員派生類不可見,基類的protected成員和public成員變成派生類的protected成員,這時在派生類 外不能使用基類的所有成員,包括public成員。
private 方式繼承:基類的private成員仍然為私有的,派生類不可見,基類中的protected成員和public成員成為了派生類中的private成 員,在派生類外不能使用基類中的任何成員。
下面我們通過例子來解釋上面的說法:
class A
{
public:
int m_public;
protected:
int m_protected;
private:
int m_private;
};
class B :public A
{
void SetPublic(int nPublic)
{
m_public = nPublic; //在派生類B中可以使用基類A中的public類型
}
void SetProtected(int nProtected)
{
m_protected = nProtected; //在派生類B中可以使用基類A中的protected類型
}
void SetPrivate(int nPrivate)
{
m_private = nPrivate; //錯誤,因為基類的private成員不能用
}
};
B b; //創建B類的對象c
b.m_public = 100; //正確
b.m_protected = 100; //錯誤,public繼承中基類的protected在派生類中是protected
b.m_private = 100; //錯誤,在派生類中都不可以直接使用,在類外就更不能了
class C :protected A
{
void SetPublic(int nPublic)
{
m_public = nPublic; //在派生類C中可以使用基類A中的public類型
}
void SetProtected(int nProtected)
{
m_protected = nProtected; //在派生類C中可以使用基類A中的protected類型
}
void SetPrivate(int nPrivate)
{
m_private = nPrivate; //錯誤,因為基類的private成員不能用
}
};
C c; //創建C類的對象c
c.m_public = 100; //錯誤,protected繼承C類里變成了protected成員
c.m_protected = 100; //錯誤,protected繼承C類里還是protected成員
c.m_private = 100; //錯誤,在派生類中都不可以直接使用,在類外就更不能了
class D :private A
{
void SetPublic(int nPublic)
{
m_public = nPublic; //在派生類D中可以使用基類A中的public類型
}
void SetProtected(int nProtected)
{
m_protected = nProtected; //在派生類D中可以使用基類A中的protected類型
}
void SetPrivate(int nPrivate)
{
m_private = nPrivate; //錯誤,因為基類的private成員不能用
}
};
D d; //創建D類的對象d
d.m_public = 100; //錯誤,private繼承D類里變成了private成員
d.m_protected = 100; //錯誤,private繼承D類里變成了private成員
d.m_private = 100; //錯誤,在派生類中都不可以直接使用,在類外就更不能了
