-------------------siwuxie095
在 C++ 中有三种继承方式:
关于 公有继承,详见本人博客的分类:C++远征,
里面的 公有继承
本人博客(任选一个)链接:
公有继承:
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后,Person中public和 //protected 下的成员被继承到Soldier中protected下 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】