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"   "   计算机会在程序的目录下(同目录下)去找这个文件

 

 

 

 

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