1、繼承概念
面向對象中的繼承指類之間的父子關係
- 子類擁有父類的所有成員變量和成員函數
- 子類就是一種特殊的父類
- 子類對象可以當作父類對象使用
- 子類可以擁有父類沒有的方法和屬性
示例:
class Parent
{
private:
int a;
public:
Parent()
{
a = 100;
}
void print()
{
cout << "a = " << a << endl;
}
};
class Child : Parent //繼承自父類,默認爲private繼承
{
};
注意:
繼承時的訪問級別設定會影響到成員的訪問級別
- C++中class的繼承默認爲private繼承
- private繼承的子類擁有父類的所有成員
- private繼承使得父類的所有成員在子類中變爲private成員
2、C++中的訪問級別與繼承
- public繼承
- 父類成員在子類中保持原有訪問級別
- private繼承
- 父類成員在子類中變爲private成員
- protected繼承
- 父類的private和protected成員在子類中保持不變
- 父類的public成員在子類中變爲protected
修改上面的程序,在子類中添加新函數,如下:
class Child : Parent //繼承自父類
{
void func()
{
a = 10;
cout << "a = " << a << endl;
}
};
嘗試編譯運行程序,會得到一些錯誤:
編譯器告訴我們,父類中的a成員變量是私有的,在子類中無法被訪問!
那麼問題來了?如果想要一個成員變量在外界不能被訪問,但是在其類中和其子類中都可以被訪問,該怎麼辦?
新的成員修飾符:protected 受保護成員
- protected成員可以在子類中被訪問,但不能在外界被訪問
- protected成員的訪問權限介於public和private之間
思考:
如何恰當的使用public,protected和private爲成員聲明訪問級別??
類成員訪問級別設置的原則
- 需要被外界訪問的成員直接設置爲public
- 只能在當前類中訪問的成員設置爲private
- 只能在當前類和子類中訪問的成員設置爲protected
注意:
private成員在子類中依然存在,但是卻無法訪問到。
3、繼承與訪問級別
父類的成員訪問級別和子類的繼承級別,共同決定了這些成員在子類中的訪問級別,該訪問級別有如下的公式:
公式:
繼承成員對外的訪問屬性
= Max{ 繼承方式, 父類成員訪問級別 }