繼承中變量重名、函數重名
#include<iostream>
using namespace std;
class CFather
{
public:
int aa;
void Fun1()
{
cout << "father fun1" << endl;
}
void Fun2()
{
cout << "father fun2" << endl;
}
};
class CSon:public CFather
{
public:
int aa;//子類中優先調用子類中的變量和函數 父類重名被隱藏
void Fun1(int a)
{
cout << "son fun1" << endl;
}
void Fun2()
{
cout << "son fun2" << endl;
}
void GetFatheraa()
{
cout << CFather::aa << endl;//加作用域後能訪問到父類aa
}
protected:
private:
};
int main()
{
CFather f;
CSon s;
f.aa = 10;
s.aa = 10;//訪問到的是子類變量
s.CFather::aa = 100;
cout << f.aa << endl;
cout << s.aa << endl;
cout << s.CFather::aa << endl;
//s.Fun1();報錯 繼承中出現函數重名不能觸發重載
s.CFather::Fun1();//需要加作用域後調用父類函數
s.Fun1(1);
s.Fun2();//默認調用子類中的函數
s.CFather::Fun2();//需要加作用域後調用父類函數
return 0;
}
繼承的訪問權限修飾符
我們看到,繼承的時候需要在子類類名後加冒號、訪問修飾符、父類類名,不同的訪問權限修飾符,繼承後對父類中成員的訪問權限是不一樣的。
基類(父類) | public | protected | private |
---|---|---|---|
公有繼承 | public | protected | 不可見(不能訪問) |
保護繼承 | protected | protected | 不可見(不能訪問) |
私有繼承 | private | private | 不可見(不能訪問) |
受影響的是通過派生類訪問時的權限(在類外)
繼承中的構造和析構函數
一個子類對象被創建,父類構造->子類構造->子類析構->父類析構。
如果父類中自定義了有參構造函數,就沒有默認無參構造函數,需要在子類初始化列表中指定父類的有參構造函數。組合的情況也一樣,要手動調用有參構造函數來初始化。
父類指針指向子類對象
可以,但是不能訪問子類的成員。
意義:提供統一接口、提高複用性