保护继承和私有继承

-------------------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】

在C++中,继承是一种允许新定义的类(派生类)继承一个已存在的类(基类)的特性的机制。理解不同继承方式的使用场景它们之间的区别对于编写高效的面向对象程序至关重要。这里,我们将详细探讨公有继承保护继承私有继承的适用性区别。 参考资源链接:[C++继承方式详解与面向对象编程](https://wenku.youkuaiyun.com/doc/81wvd042h6?spm=1055.2569.3001.10343) 公有继承(Public Inheritance)是最常见的继承方式,它创建了一个基类派生类之间的‘is-a’关系,表示派生类是基类的一种特化。公有继承时,基类的publicprotected成员保持其原有的访问权限。通常,公有继承用于实现接口的扩展功能的复用。例如,如果有一个基类Shape,派生类如Circle、Square可以通过公有继承来扩展Shape类,同时保持Shape类的接口。 保护继承(Protected Inheritance)中,基类的publicprotected成员在派生类中都会变成protected。这种方式通常用于限制派生类的接口访问,仅允许派生类及其子类访问这些成员。它表达了一种更严格的控制关系,基类的接口在派生类中被限制访问,以保护基类的实现细节不被外部世界直接访问。比如,一个类库的设计者可能使用保护继承来确保类库内部类的接口不会被使用该库的程序员直接访问。 私有继承(Private Inheritance)则将基类的publicprotected成员都变为派生类的private成员。这种继承方式通常用于实现‘has-a’或‘uses-a’关系,表示派生类拥有了基类的功能,但并不意味着派生类是基类的类型。私有继承不是用来表达继承关系的,而是用来实现代码复用的。例如,如果有一个类需要使用另一个类的功能,但不需要通过继承来扩展接口,私有继承就可以是一个合适的选择。 理解了每种继承方式之后,选择合适的继承方式对于设计类的层次结构实现代码复用非常重要。在实际编程中,公有继承是最常用的,因为它符合面向对象设计的‘is-a’关系,并且可以公开基类的接口。保护继承私有继承由于其特殊的访问控制,通常用于类库内部或特别的设计场景中。 为了深入理解这些概念,建议阅读《C++继承方式详解与面向对象编程》这本书。它不仅详细解释了不同的继承方式,还提供了丰富的实例最佳实践,帮助程序员有效地在实际项目中应用这些继承原则。 参考资源链接:[C++继承方式详解与面向对象编程](https://wenku.youkuaiyun.com/doc/81wvd042h6?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值