在讀者閱讀完這篇文章,您將會懂得三種繼承 的區別 和三種繼承對類中成員的訪問情況,很清晰,很易懂。
#include<iostream>
using namespace std;
//////////////////////////////第一部分 public 繼承//////////////
/*
class Base
{
public:
Base():x(0)
{}
~Base()
{}
public:
void SetX(int data)
{
x=data;
}
public:
void Show_Base()
{
cout<<"Show Base!"<<endl;
}
protected:
void Print_Base()
{
cout<<"Print Base!"<<endl;
}
private :
int x;
};
////////////////////////////////
//1 通過派生類內部
//子類不管怎麼繼承父類都無法繼承父類的構造和析構函數 其他全部繼承
class D:public Base
{
public:
D():y(0)
{}
~D()
{}
public:
void SetData(int data)
{
y=data;
//x=data ;這種訪問時錯誤 雖然子類繼承了父類的私有和公有但是子類不能通過公有去訪問私有;只能這樣通過公有訪問自己的私有
//如果真要對父類對父類的私有進行訪問 則要通過父類的授權 調動父類的公有函數
SetX(data);
}
public:
void Show_D()
{
cout<<"Show D!"<<endl;
Print_Base();//由此可見父類的保護成員對子類來說是透明的,可以進行訪問
}
protected:
void Print_D()
{
cout<<"Print D!"<<endl;
}
private:
int y;
//int x;
};
/////////////////////////////////////////////
//2通過對象
void main()
{
D d;
d.Show_Base();
// d.Print_Base();但在主函數中不做處理 對象是無法訪問保護函數的
}
/*
總結
一通過子類
1- 父類的私有數據在子無法直接訪問,若要訪問必須通過父類的公有方法或者私有方法
2-對子類來說可以直接訪問父類的保護方法
二 通過對象我們只能訪問子類或者父類的公有
*/
/////////第二部分 protected 繼承/////////
class Base
{
public:
Base():x(0)
{}
~Base()
{}
public:
void SetX(int data)
{
x=data;
}
public:
void Show_Base()
{
cout<<"Show Base!"<<endl;
}
protected:
void Print_Base()
{
cout<<"Print Base!"<<endl;
}
private :
int x;
};
//////////////////////
//1
/*
class D:protected Base //除過父類的拷貝 構造和析構 父類的一切屬於子類的保護成員
{
public:
D():y(0)
{}
~D()
{}
public:
void SetData(int data)
{
y=data;
SetX(data);
}
public:
void Show_D()
{
cout<<"Show D!"<<endl;
Print_Base();
}
protected:
void Print_D()
{
cout<<"Print D!"<<endl;
}
private:
int y;
//int x;
};
/////////////////////////////////////////////
//2通過對象
void main()
{
D d;
d.Show_D();
// d.Show_Base();訪問錯誤 父類的公有已經在子類稱爲保護,對象無法被訪問
}
/*
總結
繼承和訪問是不同的 不能訪問不一定沒有被繼承
1-父類的私有成員不管通過什麼方法都無法在子類公有裏面進行直接訪問
2-子類的公有方法可以訪問子類父類的保護成員
特殊:3-不管怎樣 父類的私有和子類的私有不一樣 不能被直接訪問
4-對象永遠只能訪問我們的公有方法;
*/
////////第三部分 private 繼承////
class D:private Base
{
public:
D():y(0)
{}
~D()
{}
public:
void SetData(int data)
{
y=data;
SetX(data);
}
public:
void Show_D()
{
cout<<"Show D!"<<endl;
Print_Base();
}
protected:
void Print_D()
{
cout<<"Print D!"<<endl;
}
private:
int y;
//int x;
};
/////////////////////////////////////////////
//2通過對象
void main()
{
D d;
d.Show_D();
// d.SetData();訪問錯誤 父類的公有 子類的私有 對象無法訪問
}
/*
總結
1-子類私有繼承之類後將父類的對象變爲自己的私有 隨後子類該怎麼訪問就怎麼訪問
2-對象仍然只是能訪問子類的公有,對於保護和私有無法訪問
/
/////////
/
總結
由上可以發現私有和保護繼承對於對象來說都是一樣的
但是如果還存在 class C 我們發現父類在D裏面私有繼承之後,C繼承D之後是無法訪問Base中的任何東西
但是保護訪問不一樣,在C裏面仍然可以繼續進行繼承
class E():Base 在這裏 若不寫私有 保護 公有,則默認爲最安全的方式私有繼承
*/