C++繼承2 保護、私有繼承

一、理論知識

保護繼承

私有繼承

二、代碼演示

創建Person類,數據成員:Name,成員函數:構造 play()

創建Soldier類,數據成員:Age,成員函數:構造 work()

創建Infantry類,成員函數attack()

1、如何證明,在保護繼承的方式下,父類Person的public和protected訪問限定符下的數據成員和成員函數被繼承到了子類Soldier的protected下,而不是public訪問限定符下?

Person.h

#include<iostream>
#include<string>
using namespace std;

class Person
{
public:
	Person();
	void play();
protected:
	string Name;
};

Person.cpp

#include"Person.h"

Person::Person()
{
	Name = "v";
}

void Person::play()
{
	cout<<"Person--play()"<<endl;
	cout<<Name<<endl;
}

Soldier.h

#include"Person.h"

//class Soldier:private Person
class Soldier:protected Person//保護繼承
{
public:
	Soldier();
	void work();
protected:
	int Age;
};

Soldier.cpp

#include"Soldier.h"

Soldier::Soldier()
{
	
}

void Soldier::work()
{
	Name = "v";//person的數據成員
	Age = 20;

	cout<<Name<<endl;
	cout<<Age<<endl;
	cout<<"Soldier--work()"<<endl;
}

main.cpp

main.cpp
#include<stdlib.h>
#include"Soldier.h"

int main(void)
{
	Soldier soldier;
	soldier.work();//soldier類的成員函數//ok
	
	soldier.play();//person類的成員函數//erro 類中可以實現但是在類外實例化的對象去訪問protected下的數據成員和成員函數是不行的
	
}

運行結果:

程序無法執行,說明了子類從父類保護繼承,父類中public和protected訪問限定符下的數據成員和成員函數被保護繼承到子類的protected訪問限定符下,而不是public下;如果是被繼承到了public下,用實例化的對象soldier去訪問父類的成員函數就不會出現無法訪問的情況,而如圖運行結果程序出錯。

 

2、如何證明,在保護繼承的方式下,父類Person的public和protected訪問限定符下的數據成員和成員函數被繼承到了子類Soldier的protected下,而不是private下?

      再定義一個Infantry類,來公共繼承Soldier類,在main 函數中實例化一個Infantry對象,如果Infantry中的成員函數可以訪問到person中的數據,則證明在保護繼承的方式下,父類的public和protected訪問限定符下的數據成員和成員函數被繼承到了子類的protected下;如果不能訪問,則是被繼承到了private下。

原理如圖:

 

代碼示例:

Person類和Soldier類不做改變,增加Infantry類公有繼承Soldier類

Infantry.h

#include"Soldier.h"

class Infantry:public Soldier
{
public:
	void attack();
};

Infantry.cpp

#include"Infantry.h"

void Infantry::attack()
{
	Name = "V";
	cout<<Name<<endl;
	cout<<"Infantry--attack()"<<endl;
}

main.cpp

#include<stdlib.h>
#include"Infantry.h"

int main(void)
{
	Infantry soldier;
	soldier.attack();
}

運行結果:

Infantry實例化出的對象可以正常訪問到Person中的數據,說明在保護繼承的方式下,父類的public和protected訪問限定符下的數據成員和成員函數被繼承到了子類的protected下。

 

3、將Soldier的繼承方式改爲private 

Soldier.h

#include"Person.h"

class Soldier:private Person
{
public:
	Soldier();
	void work();
protected:
	int Age;
};

main.cpp

#include<stdlib.h>
//#include"Soldier.h"
#include"Infantry.h"

int main(void)
{
	//將Soldier的繼承方式改爲private 
	Infantry soldier;
	soldier.attack();//erro
}

運行結果:

程序出錯,Soldier私有繼承Person類,Person類中public和protected下的成員函數和數據成員都被繼承到Soldier類的private下,Infantry類公有繼承Soldier類,則無法訪問Soldier類下的私有數據成員和成員函數。

 

 

 

 

 

 

 

 

 

 

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