C++繼承3 隱藏

一、隱藏

隱藏是指派生類的函數屏蔽了與其同名的基類函數。

這裏有兩種情況:
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"   "   計算機會在程序的目錄下(同目錄下)去找這個文件

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章