C++中的类继承(1) 三种继承方式
来源:互联网 发布:yy头像制作软件 编辑:程序博客网 时间:2024/05/24 06:20
继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程。C++中的继承关系就好比现实生活中的父子关系,继承一笔财产比白手起家要容易得多,原始类称为基类,继承类称为子类,它们是类似于父亲和儿子的关系,所以也分别叫父类和子类。继承的方式有三种分别为公有继承(public),保护继承(protect),私有继承(private)。
定义格式如下:
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
2. 私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
private能够对外部和子类保密,即除了成员所在的类本身可以访问之外,别的都不能直接访问。protected能够对外部保密,但允许子类直接访问这些成员。public、private和protected对成员数据或成员函数的保护程度可以用下表来描述:举个栗子:
1 class Base //父类 2 { 3 private: 4 int _priB; 5 protected: 6 int _proB; 7 public: 8 int _pubB; 9 } ;10 class Derived: public Base //子类,继承自base,继承类型为公有继承11 {12 private:13 int _d_pri;14 protected:15 int _d_pro;16 public:17 void funct()18 {19 int d;20 d=_priB; //error:基类中私有成员在派生类中是不可见的21 d=_proB; //ok: 基类的保护成员在派生类中为保护成员22 d=_pubB; //ok: 基类的公共成员在派生类中为公共成员23 }24 int _d_pub;25 } ;
总结:1. public继承是一个接口 继承, 保持is-a原则, 每个父类可用的成员 对子类也可用, 因为每个子类 对象也都是一个父类对象。
26 class C :private A //基类Base的派生类C(私有继承)27 {28 public:29 void funct()30 {31 int c;32 c=_priB; //error:基类中私有成员在派生类中是不可见的33 c=_proB; //ok:基类的保护成员在派生类中为私有成员34 c=_pubB; //ok:基类的公共成员在派生类中为私有成员35 }36 };37 class E :protected A //基类Base的派生类E(保护继承)38 {39 public:40 void funct()41 {42 int e ;43 e=_priB; //error:基类中私有成员在派生类中是不可见的44 e=_proB; //ok:基类的保护成员在派生类中为保护成员45 e=_pubB; //ok:基类的公共成员在派生类中为保护成员46 }47 };
总结:
2. 基类的private成员 在派生类中是不能被访问的, 如果基类成员 不想在类外直接被访问, 但需要 在派生类中能访问, 就定义为protected。 可以看出保护成员 限定符是因继承才出现的。
3. protected/private继承是一个实现继承, 基类的部分成员 并非完全成为子类接口 的一部分, 是 has-a 的关系原则, 所以非特殊情况下不会使用这两种继承关系, 在绝大多数的场景下使用的 都是公有继承。 私有继承以为这is-implemented-in-terms-of(是根据……实现的) 。 通常比组合(composition) 更低级, 但当一个派生类需要访问 基类保护成员 或需要重定义基类的虚函数时它就是合理的。
49 int main()50 {51 int a; 53 D d;54 a=D._priB; //error:公有继承基类中私有成员在派生类中是不可见的,对对象不可见55 a=D._proB; //error:公有继承基类的保护成员在派生类中为保护成员,对对象不可见56 a=D._pubB; //ok:公有继承基类的公共成员在派生类中为公共成员,对对象可见58 B b;59 a=c._priB; //error:私有继承基类中私有成员在派生类中是不可见的,对对象不可见60 a=c._proB; //error:私有继承基类的保护成员在派生类中为私有成员,对对象不可见61 a=c._pubB; //error:私有继承基类的公共成员在派生类中为私有成员,对对象不可见63 C c;64 a=e._priB; //error:保护继承基类中私有成员在派生类中是不可见的,对对象不可见65 a=e._proB; //error:保护继承基类的保护成员在派生类中为保护成员,对对象不可见66 a=e._pubB; //error:保护继承基类的公共成员在派生类中为保护成员,对对象不可见67 68 return 0;69 }
4. 不管是哪种继承方式, 在派生类内 部都可以访问基类的公有成员 和保护成员 , 基类的私有成员 存在但是在子类中不可见( 不能访问) 。
5. 使用关键字class时默认的继承方式是private, 使用struct时默认的继承方式是public, 不过最好显示的写出继承方式。
6. 在实际运用中一般使用都是public继承, 极少场景下才会使用protetced/private继承。
在struct继承中,如果没有显式给出继承类型,则默认的为public继承;在class继承中,如果没有显式给出继承类型,则默认的为private继承;
继承关系&访问限定符
- C++中的类继承(1) 三种继承方式
- 探究C++中的三种继承方式!
- C++——三种继承方式
- 三种继承方式
- 三种继承方式
- 共有继承 私有继承 保护继承 派生类的三种继承方式小结
- 派生类的三种继承方式
- C++三种继承方式
- C++三种继承方式
- C++三种继承方式
- C++ 三种继承方式
- 三种继承方式总结
- JS继承三种方式
- C++三种继承方式
- C++三种继承方式
- 《三种继承方式详解》
- 《三种继承方式详解》
- C++三种继承方式
- C++中的继承(3)作用域与重定义,赋值兼容规则
- tensorflow函数--softmax_cross_entropy_with_logits
- BZOJ 1179: [Apio2009]Atm
- (c语言)结构体方法,计算该日是当年的第几天
- 建立HashSet的实例,依次填入三个名字判断实例中是否存在"Kobe"
- C++中的类继承(1) 三种继承方式
- Windows 10 很快变得更安全
- win10 uwp 拖动控件
- vim中文帮助文档安装
- next_permutation函数(全排列)
- 视觉导航路径编辑器使用教程
- 欧拉函数模板
- EA&UML日拱一卒--类图::泛化(generalization)
- poj 1469 COURSES