Fork me on GitHub

保护继承和私有继承

-------------------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");

return 0;

}

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

   

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

posted on 2017-05-03 14:51  siwuxie095  阅读(367)  评论(0)    收藏  举报

导航