一、隱藏
隱藏是指派生類的函數屏蔽了與其同名的基類函數。
這裏有兩種情況:
1>子類函數名,參數列表,返回值類型與基類的完全一樣,此時基類中被隱藏的函數不能有virtual修飾(否則就是覆蓋)
2>函數同名,但是參數列表不同,此時基類中被隱藏的函數有沒有virtual修飾均可。
隱藏特性的主要體現:當實例化B的對象的時候,該對象只能直接訪問子類的aa(),而不能訪問父類的aa(),父類的aa()看似隱藏但是實則也被繼承了下來,可以通過別的方式訪問。
隱藏的要素:繼承關係 函數名相同 參數列表不同
繼承關係中,父類中與子類同名的數據成員和成員函數都會被隱藏。
二、代碼演示
創建Person類,數據成員:m_strName,成員函數:構造函數、play()
創建Soldier類 數據成員:m_strName,成員函數:構造 、work()、play()
Person.h
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person();
void play();
protected:
string m_strName;
};
Person.cpp
#include"Person.h"
Person::Person()
{
m_strName = "v";
}
void Person::play()
{
cout<<"Person--play()"<<endl;
cout<<m_strName<<endl;
}
Soldier.h
#include"Person.h"
class Soldier:public Person
{
public:
Soldier();
void play(int x);//爲了證明函數名相同 但是參數不同的時候 是否存在隱藏的關係
void work();
protected:
string m_strName;//定義與Person同名的數據成員
};
Soldier.cpp
#include"Soldier.h"
Soldier::Soldier()
{
}
void Soldier::play(int x)
{
cout<<m_strName<<endl;
cout<<Person::m_strName<<endl;////訪問從父類繼承下來的m_strName
cout<<"Soldier--play()"<<endl;
}
void Soldier::work()
{
m_strName = "wls";
Person::m_strName = "wlsv";//訪問從父類繼承下來的m_strName
cout<<"Soldier--work()"<<endl;
}
main.cpp
#include"Soldier.h"
//隱藏
int main(void)
{
Soldier soldier;
soldier.work();
soldier.play(7);//函數名相同 參數列表不同 隱藏
soldier.play();//erro 無法形成重載 只能形成隱藏
soldier.Person::play();//訪問從父類繼承下來的play()
return 0;
}
運行結果:
main.cpp
#include"Soldier.h"
//隱藏
int main(void)
{
Soldier soldier;
soldier.work();
soldier.play(7);//函數名相同 參數列表不同 隱藏
//soldier.play();//erro 無法形成重載 只能形成隱藏
soldier.Person::play();//訪問從父類繼承下來的play()
return 0;
}
運行結果:
根據運行結果,首先打印出soldier--work(),之後對象soldier去訪問play(),play()函數是父類子類同名的函數,打印出soldier--play()說明了子類的隱藏了父類的play();soldier.Person::play()這種方式可以訪問從父類繼承下來的play(),所以打印出person--play();因爲父類與子類有同名的數據成員m_strName,所以父類的數據被子類的隱藏。
其他小知識點:
#include< > 計算機會去搜索程序的默認庫
#include" " 計算機會在程序的目錄下(同目錄下)去找這個文件