C++的繼承機制有三種 : private , protected , public 。 每種繼承方式對於衍生類別繼承自基礎類別的成員存取權限將有所不同。
以下片斷程式為定義基礎類別 :
class Base //開始定義類別
{
private: //宣告private等級的成員
int pri_att;
void pri_show()
{ cout << "Base::pri_show() is called!" << endl; }
protected: //宣告protected等級的成員
int pro_att;
void pro_show()
{ cout << "Base::pro_show() is called!" << endl; }
public: //宣告public等級的成員
Base()
: pri_att(1), pro_att(2), pub_att(3){}
int pub_att;
void pub_show()
{ cout << "Base::pub_show() is called!" << endl; }
};
宣告一個Derived類別以private 等級來繼承Base類別時:基礎類別內private等級的成員,將被隱藏,衍生類別成員無法存取。基礎類別內protected ,public等級成員則變成private 等級被繼承,在類別程式外必須透過衍生類別成員函數才可存取繼承自基礎類別的資料成員。
//以private成員函數繼承Base類別
class Derived : private Base
{
public: //宣告成員函數
void show();
};
void Derived::show()
{
cout << "Base::pub_att = " << pub_att << endl;//存取基本類別的資料成員
cout << "Base::pro_att = " << pro_att << endl;//存取基本類別的資料成員
//cout << "Base::pri_att = " <<
pri_att << endl; 因隱藏無法存取
}
int main() //主程式開始
{
Derived A_Derived;
A_Derived.show();//必須透過show函數存取基本類別的資料成員
}
衍生類別以public等級來繼承Base類別時:基礎類別內private等級的成員,將被隱藏 ,衍生類別成員無法存取。基礎類別內protected ,public等級成員權限不變,在類別程式外只有權限為public等級的資料成員才可直接透過Derived物件 存取。
//以public成員函數繼承Base類別
class Derived : public Base
{
public: //宣告成員函數
void show_pro(){ cout << "Base::pro_att = " << pro_att << endl ; }
};
int main() //主程式開始
{
Derived A_Derived;
//cout << "A_Derived.pro_att = " << pro_att << endl; 無法直接存取
A_Derived.show_pro();//需透過Derived物件成員函數才可存取
cout << A_Derived.pub_att << endl;//直接存取基本類別的資料成員
}
衍生類別以protected等級來繼承Base類別時:基礎類別內private等級的成員,將被隱藏 ,衍生類別成員無法存取。基礎類別內 public等級成員權限變為protected ,在類別程式外只有權限為public等級才可直接透過Derived物件 存取。
//以private成員函數繼承Base類別
class Derived : protected Base
{
public: //宣告成員函數
void show();
};
//存取繼承自Derived類別的資料成員
void Second_Derived::show()
{
cout << endl;
cout << "Second_Derived::show() is called!" << endl;
cout << "Base::pub_att = " << pub_att << endl;
cout << "Base::pro_att = " << pro_att << endl;
//cout << "Base::pri_att = " << pri_att << endl;
}
int main() //主程式開始
{
Derived A_Derived;
//cout << "Derived::pub_att = " <<
A_Derived.pub_att << endl; 無法存取
//cout << "Derived::pro_att = " << A_Derived.pro_att << endl; 無法存取
//cout << "Derived::pri_att = " << A_Derived.pri_att << endl; 無法存取
A_Derived.show();//需透過Derived物件成員函數才可存取
}
若要再宣告一個S_Derived類別以public來繼承 Derived 權限為private的類別,達成雙重繼承的話,S_Derived類別的成員函數無法存取基礎類別的資料成員跟成員函數,因Derived類別將其權限設為private 。
#include <iostream>
using namespace std; //使用std命名空間
class Base //開始定義類別
{
private: //宣告private等級的成員
int pri_att;
void pri_show()
{ cout << "Base::pri_show() is called!" << endl; }
protected: //宣告protected等級的成員
int pro_att;
void pro_show()
{ cout << "Base::pro_show() is called!" << endl; }
public: //宣告public等級的成員
Base()
: pri_att(1), pro_att(2), pub_att(3){}
int pub_att;
void pub_show()
{ cout << "Base::pub_show() is called!" << endl; }
};
//以public成員函數繼承Base類別
class Derived : private Base
{
public: //宣告成員函數
void call_fun();
void show();
};
//呼叫繼承自Base類別的成員函數
void Derived::call_fun()
{
cout << endl;
cout << "Derived::call_fun is called!" << endl;
pub_show();
pro_show();
//pri_show();
}
//存取繼承自Base類別的資料成員
void Derived::show()
{
cout << endl;
cout << "Derived::show() is called!" << endl;
cout << "Base::pub_att = " << pub_att << endl;
cout << "Base::pro_att = " << pro_att << endl;
//cout << "Base::pri_att = " << pri_att << endl;
}
class S_Derived : private Derived
{
public :
void show();
void call_fun();
};
//-----------------------------
void S_Derived::call_fun()
{
cout << endl;
cout << "S_Derived::call_fun is called!" << endl;
//pub_show();
// pro_show();
}
//-----------------------------
void S_Derived::show()
{
cout << endl;
cout << "S_Derived::show() is called!" << endl;
// cout << "Base::pub_att = " << pub_att << endl;
// cout << "Base::pro_att = " << pro_att << endl;
//cout << "Base::pri_att = " << pri_att << endl;
}
int main() //主程式開始
{
Derived A_Derived;
S_Derived B_Derived;
//透過Dervied物件存取繼承自Base類別的資料成員
cout << "Accessing Derived's data members"
<< " inherited form Base..." << endl;
//cout << "Derived::pub_att = " << A_Derived.pub_att << endl;
//cout << "Derived::pro_att = " << A_Derived.pro_att << endl;
//cout << "Derived::pri_att = " << A_Derived.pri_att << endl;
cout << endl;
//透過Dervied物件呼叫繼承自Base類別的成員函數
cout << "Call Derived's member functions"
<< " inherited form Base..." << endl;
//A_Derived.pub_show();
//A_Derived.pro_show();
//A_Derived.pri_show();
A_Derived.call_fun();
//呼叫Dervied物件的call_fun()成員函數,
//測試Dervied類別之成員函數是否可呼叫繼承自Base類別的成員函數
A_Derived.show();
//呼叫Dervied物件的show()成員函數,
//測試Dervied類別之成員函數是否可存取繼承自Base類別的資料成員
B_Derived.call_fun();
B_Derived.show();
system("PAUSE");
return 0;
} //主程式結束