1.公有繼承–public
公有繼承時,對基類的公有成員和保護成員的訪問屬性不變,派生類的新增成員能夠訪問基類的公有成員和保護成員,可是訪問不了基類的私有成員。派生類的對象只能訪問派生類的公有成員(包括繼承的公有成員),訪問不了保護成員和私有成員。ios
#include <iostream>
using namespace std;spa
class Base
{
public:
Base(int nId) {mId = nId;}
int GetId() {mId++;cout<< mId<<endl;return mId;}
protected:
int GetNum() {cout<< 0 <<endl;return 0;}
private:
int mId;
};對象
class Child : public Base
{
public:
Child() : Base(7) {;}
int GetCId() {return GetId();} //新增成員能夠訪問公有成員
int GetCNum() {return GetNum();} //新增成員能夠訪問保護成員
//沒法訪問基類的私有成員
protected:
int y;
private:
int x;
};blog
int main()
{
Child child;
child.GetId(); //派生類的對象能夠訪問派生類繼承下來的公有成員
//child.GetNum(); //沒法訪問繼承下來的保護成員GetNum()
child.GetCId();
child.GetCNum(); //派生類對象能夠訪問派生類的公有成員
//child.x;
//child.y; //沒法訪問派生類的保護成員y和私有成員x
return 0;
}
2.保護繼承–protected
保護繼承中,基類的公有成員和保護成員被派生類繼承後變成保護成員,派生類的新增成員能夠訪問基類的公有成員和保護成員,可是訪問不了基類的私有成員。派生類的對象不能訪問派生類繼承基類的公有成員,保護成員和私有成員。繼承
class Child : protected Base
{
public:
Child() : Base(7) {;}
int GetCId() {return GetId();} //能夠訪問基類的公有成員和保護成員
int GetCNum() {return GetNum();}
protected:
int y;
private:
int x;
};io
int main()
{
Child child;
//child.GetId();//派生類對象訪問不了繼承的公有成員,由於此時保護繼承時GetId()已經爲 protected類型
//child.GetNum(); //這個也訪問不了
child.GetCId();
child.GetCNum();
return 0;
}
3.私有繼承–private
私有繼承時,基類的公有成員和保護成員都被派生類繼承下來以後變成私有成員,派生類的新增成員能夠訪問基類的公有成員和保護成員,可是訪問不了基類的私有成員。派生類的對象不能訪問派生類繼承基類的公有成員,保護成員和私有成員。class
class Child : private Base
{
public:
Child() : Base(7) {;}
int GetCId() {return GetId();} //能夠訪問基類的公有成員和保護成員
int GetCNum() {return GetNum();}
protected:
int y;
private:
int x;
};stream
int main()
{
Child child;
//child.GetId();//派生類對象訪問不了繼承的公有成員,由於此時私有繼承時GetId()已經爲 private類型
//child.GetNum(); //派生類對象訪問不了繼承的保護成員,並且此時私有繼承時GetNum()已經爲 private類型
child.GetCId();
child.GetCNum();
return 0;
}
4.總結
無論是哪一種繼承方式,派生類中新增成員能夠訪問基類的公有成員和保護成員,沒法訪問私有成員。而繼承方式影響的是派生類繼承成員訪問屬性,而使用友元(friend)能夠訪問保護成員和私有成員。
派生類對象的訪問權限 權限