保护继承和私有继承

-------------------siwuxie095

  

  

  

  

  

  

  

在 C++ 中有三种继承方式:

  

保护继承和私有继承

  

  

  

关于公有继承,详见本人博客的分类:C++远征

里面的公有继承

 

 

本人博客(任选一个)链接:

https://www.baidu.com/s?ie=UTF-8&wd=siwuxie095

  

  

  

  

公有继承:

  

1)基类中public 下的成员将被继承到派生类中 public 下

2)基类中protected 下的成员将被继承到派生类中 protected 下

3)基类中private 下的成员将被继承到派生类中不可见位置,但无法直接访问,

没有被继承到派生类中 private 下

  

保护继承和私有继承

  

  

  

保护继承:

  

1)基类中public 下的成员将被继承到派生类中 protected 下

2)基类中protected 下的成员也将被继承到派生类中 protected 下

3)基类中private 下的成员将被继承到派生类中不可见位置,但无法直接访问

  

保护继承和私有继承

  

  

 

私有继承:

  

1)基类中public 下的成员将被继承到派生类中 private 下

2)基类中protected 下的成员也将被继承到派生类中 private 下

3)基类中private 下的成员将被继承到派生类中不可见位置,但无法直接访问

  

保护继承和私有继承

  

  

  

在这三种继承关系中,以 私有继承-private 最为特殊

  

为了说明这种特殊性,看如下实例:线段类与坐标类的关系

  

保护继承和私有继承

  

保护继承和私有继承

  

  

可以看出,在线段类中有两个坐标类的对象:m_coorA 和 m_coorB

  

  

在这种关系中,线段类只能访问到坐标类中的公有数据成员和公有成员

函数

  

而在私有继承中,子类对象也只能访问父类的公有数据成员和公有成员

函数

  

  

这两者是很相似的,在 C++ 中把线段和坐标的这种关系,称之为has-a

即 线段中有一个坐标,这种关系是一种包含关系,在私有继承中也是一种

包含关系,当定义一个子类对象时,子类对象中就包含了一个父类的对象。

因为它只能访问父类中公有的数据成员和成员函数,所以,从本质上来说,

私有继承也是一种has-a 的关系

  

  

  

  

  

  

程序:

  

Person.h:

  

#include <string>

using namespace std;

  

class Person

{

public:

Person();

void play();

protected:

string m_strName;

};

  

  

  

Person.cpp:

  

#include"Person.h"

#include <iostream>

using namespace std;

  

  

Person::Person()

{

m_strName = "Merry";

}

  

void Person::play()

{

cout << "Person--play()" << endl;

cout << m_strName << endl;

}

  

  

  

Soldier.h:

  

#include"Person.h"

  

class Soldier:protected Person//继承方式换为 private 后就不一样了

{

public:

Soldier();

void work();

protected:

int m_iAge;

};

  

  

  

Soldier.cpp:

  

#include"Soldier.h"

#include <iostream>

using namespace std;

  

  

Soldier::Soldier()

{

  

}

  

void Soldier::work()

{

cout << "Soldier--work()" << endl;

m_strName = "Jim";

m_iAge = 20;

cout << m_strName << "," << m_iAge << endl;

}

  

  

  

Infantry.h:

  

#include"Soldier.h"

  

class Infantry:public Soldier

{

public:

void attack();

};

  

  

  

Infantry.cpp:

  

#include"Infantry.h"

#include <iostream>

using namespace std;

  

  

void Infantry::attack()

{

cout << "Infantry--attack()" << endl;

//证明Soldier保护继承了Person后,Personpublic

//protected 下的成员被继承到Soldierprotected

m_strName = "James";

m_iAge = 30;

cout << m_strName << "," << m_iAge << endl;

}

  

  

  

main.cpp:

  

#include <stdlib.h>

#include"Infantry.h"

using namespace std;

  

  

int main(void)

{

Soldier soldier;

//soldier.play(); //因为是保护继承所以无法被子类对象访问

soldier.work();

Infantry infantry;

infantry.attack();

system("pause");

return0;

}

//主要体会 Soldier.h 处的继承方式 protected private

  

  

  

  

  

  

  

  

  

  

  

【made by siwuxie095】