一、理論知識
保護繼承
私有繼承
二、代碼演示
創建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類下的私有數據成員和成員函數。