public公有继承

protected保护继承

private私有继承

我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用.

公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类中可直接使用.继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接使用.

保护继承时,基类的private成员仍为有私有.基类的public和protected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员

私有继承时,基类的private成员仍为有私有.基类的public和protected成员将变成派生类的private成员.

举个例子.

class A

{

public:

int m_nTelNum;

protected:

int m_nAge;

private:

int m_nMoney;

};

class B:public A

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;

}

void SetAge(int nAge)

{

m_nAge=nAge;

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这里就出现错误,因为基类的private成员不能用.

}

};

B objB;//创建B类的对象objB

objB.m_nTelNum=123456;//可以

objB.m_nAge=30;//错误.public继承中基类的protected在派生类中是protected

objB.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

class C:protected A

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;

}

void SetAge(int nAge)

{

m_nAge=nAge;

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

}

};

C objC;//创建C类的对象objC

objC.m_nTelNum=123456;//注意这里和public的区别,这里错误,m_nTelNum变成了C类的protected成员

objC.m_nAge=30;//错误.protected继承中基类的protected在派生类中是protected,这与public同相

objC.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

class D:private A

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;

}

void SetAge(int nAge)

{

m_nAge=nAge;

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

}

};

D objD;//创建D类的对象objD

objD.m_nTelNum=123456;//错误,m_nTelNum变成了D类的private成员

objD.m_nAge=30;//错误.private继承中基类的protected在派生类中是private

objD.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同.现在还看不出public和protected继承的区别

那再看一个例子.

class E:public B

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;//可以 因为这是B的公有成员

}

void SetAge(int nAge)

{

m_nAge=nAge;//可以 因为这是B的保护成员,现成变成E的protected成员

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这个肯定不可以!

}

};

E objE;//

objE.m_nTelNum=123456;//可以

//其它的两个就不能用了.

class F:public C

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;//可以 因为这是C的保护成员,这里与public继承已经有区别但还没有表现出来

}

void SetAge(int nAge)

{

m_nAge=nAge;//可以 因为这是C的保护成员,现成变成E的protected成员

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这个肯定不可以!

}

};

F objF;

objF.m_nTel=123456;//错误,因为这是F的保护成员.注意与E类区别

class G:public D

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;//不可以 因为这是D的private成员,注意这里区别

}

void SetAge(int nAge)

{

m_nAge=nAge;//不可以 因为这是D的private成员,注意区别

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这个肯定不可以!

}

};

//那G在类外就没有了可以引用的继承过来成员了!

//这些继承方式是很难理解的.最好的办法就是多写代码去试.

c++中三种继承方式的区别的更多相关文章

  1. C++ 中三种继承方式的理解

    一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下:   我们用代 ...

  2. mfc 类三种继承方式下的访问

    知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...

  3. C++中的三种继承方式

    1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? class Parent { }; class Child : public Parent ...

  4. C++的三种继承方式详解以及区别

    目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...

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

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  6. C++的三种继承方式简述

    C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...

  7. C++继承(一) 三种继承方式

    继承定义 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一. 继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展.原来的类称为基类,继承的类称为派生类,他们的关系就像父子 ...

  8. c++三种继承方式public,protect,private

    C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...

  9. C++三种继承方式

    一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.

随机推荐

  1. navicat 关于orcale新建表空间,用户和权限分配

    图文教程,直观, 上面连接数据库 下面创建表空间 建表空间的设置 表空间名的设置 新建用户 填写用户名,选择默认表空间 成员属性德设置,这里因为是自己用,所以选择最大权限,其他的权限这是需要专业的了 ...

  2. 分布式环境下的session管理

    一.分布式Session的几种实现方式 1.1.基于cookie 进行session共享 简单.方便,每次通过判断cookie中的用户状态信息判断用户的登录状态:但是用户信息要存在客户端,存在安全隐患 ...

  3. JAVA 编程思想二

    1: java  单根继承的优点? 方便垃圾回收: 垃圾回收的设计会方便实现.   多重继承的函数重名的问题. 2: 向下转型和向上转型?    向下转型不安全,向上转型安全. 3: system.g ...

  4. David Malan teaching CS75 lecture 9, Scalability

    https://youtu.be/-W9F__D3oY4 Storage PATA, SATA, SAS (15,000 rpm), SSD, RAID0 : striping, double thr ...

  5. “找女神要QQ号码”——跟风篇java新手版(求指点)

    吃完粽子后闲来无事,于是准备在园子里面看看.突然看到了一个“找女神要QQ号码”的文章,顿时精力充沛了~~^_^. 该文章楼主说明此算法来自于<啊哈!算法>,图文并茂,非常不错.<啊哈 ...

  6. JAVA学习笔记——(四)

    今日内容介绍 1.流程控制语句switch 2.数组 3.随机点名器案例 01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪 ...

  7. 2. docker 容器的管理(创建、查看、启动、终止、删除)

    一.创建 docker create:创建容器,处于停止状态. centos:latest:centos容器:最新版本(也可以指定具体的版本号). 本地有就使用本地镜像,没有则从远程镜像库拉取. 创建 ...

  8. Centos7.2 安装配置 Tengine(nginx)

    一.下载tengine wget http://tengine.taobao.org/download/tengine-2.2.2.tar.gz 二.安装tenginx(nginx)的模块依赖库 yu ...

  9. HDU - 6341 多校4 Let Sudoku Rotate(状压dfs)

    Problem J. Let Sudoku Rotate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  10. ASP.NET学习笔记(二)语法

    基本的 ASP 语法规则 通常情况下,ASP 文件包含 HTML 标签,类似 HTML 文件.不过,ASP 文件也能够包含服务器端脚本,这些脚本被分隔符 <% 和 %> 包围起来. 在 A ...