C++中的类继承(1) 三种继承方式

继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程。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继承;

继承关系&访问限定符

时间: 2024-12-27 21:09:21

C++中的类继承(1) 三种继承方式的相关文章

nios软核cpu中架构类shell的一种解决方式

在nios中要实现一个类shell的交互系统,用户在终端可以通过命令调用系统函数. 想到linus当年在写下系统函数调用时,其实基于的思想是一样的,就是查表,每一种系统函数都对应一种中断服务号,然后通过0x80系统调用进入内核,然后查表,这里就可以找到对应的内核系统函数,回顾一下linus是怎么做到的. 就以系统函数open为例子 int open(const char * filename, int flag, ...) { register int res; va_list arg; va_

sql注入过程中后台数据库类型的三种判断方式

后台数据库类型判断: 一.通过页面返回的报错信息,一般情况下页面报错会显示是什么数据库类型,在此不多说: 二.通过各个数据库特有的数据表来判断: 1.mssql数据库 http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1 2.access数据库 http://127.0.0.1/test.php?id=1 and (select count(*) from msysobjects)>0 an

Servlet三种实现方式

Servlet三种实现方式:实现Servlet接口,继承GenericServlet ,继承HttpServlet. 1.实现Servlet接口: import javax.servlet.*; import java.io.*; public class Hello implements Servlet{ //执行条件:reload,关闭tomcat,关机 public void destroy() { // TODO Auto-generated method stub System.out

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链 JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 1.Object类 在JS中,Object是所有类的基

C++中的三种继承方式

1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? 1 class Parent 2 { 3 4 }; 5 6 class Child : public Parent 7 { 8 9 }; 2,有趣的问题: 1,是否可以将继承语句中的 public 换成 protected 或者 private?如果可以,与 public 继承有什么区别? 3,有趣的尝试编程实验: 1 #include <iostream> 2 #include &l

C++中三种继承方式的区别

本文来自https://zhidao.baidu.com/question/159111767.html  详细说明了三种继承方式的区别,好文 还可参考另一篇文章: https://blog.csdn.net/one_super_dreamer/article/details/81611118 https://blog.csdn.net/u011857683/article/details/82120998 public公有继承 protected保护继承 private私有继承 我们知道类的p

【转载】取得系统中网卡MAC地址的三种方法

From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址,一般说网卡地址我是指物理地址,不知道别人怎么看?物理地址指的是网卡上的存放地址的ROM里的地址,mac地址是这块卡工作的时候用的地址,一般情况下这两个地址是一样的,所以很多人都混用了,甚至不知道有区别  -_-# 网卡工作的时候,一个以太网帧60到1514(不包括crc),帧的crc是网卡自动加的

js的三种继承方式及其优缺点

第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = 'yellow'; this.view = function(){ return this.hair + ',' + this.eye + ',' + this.skin; } } //子类 function man(){ this.feature = ['beard','strong']; } man.pr