c++中三种继承方式的区别
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++中三种继承方式的区别的更多相关文章
- C++ 中三种继承方式的理解
一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下: 我们用代 ...
- mfc 类三种继承方式下的访问
知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...
- C++中的三种继承方式
1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? class Parent { }; class Child : public Parent ...
- C++的三种继承方式详解以及区别
目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- C++的三种继承方式简述
C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...
- C++继承(一) 三种继承方式
继承定义 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一. 继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展.原来的类称为基类,继承的类称为派生类,他们的关系就像父子 ...
- c++三种继承方式public,protect,private
C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...
- C++三种继承方式
一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.
随机推荐
- Jasper:SAOP API 函数
ylbtech-Jasper:SAOP API 函数 1.设备API返回顶部 1. 设备 设备 API 可以访问详细的设备(SIM 卡)信息,包括当前会话.您也可以更改属性值. API 调用 描述 A ...
- git简单获取远程某个分支代码命令
git clone resource.git git branch -a list all the local and remote branches git checkout [remote bra ...
- JavaScript高级程序设计学习笔记第二章
1.向 HTML 页面中插入 JavaScript 的主要方法,就是使用<script>元素 2.HTML 4.01中定义了<script>元素的六个属性(方便记忆,可将6个属 ...
- FASTQ格式
FASQT格式是用于存储生物序列(通常是核苷酸序列)及其相应的碱基质量分数的一种文本格式.为简洁起见,序列字母和质量分数均使用单个ASCII字符进行编码.最初由Wellcome Trust Sange ...
- dpdk数据包捕获技术笔记1
1 高效捕包技术的重要性 高性能系统需要在很短的时间内,成功的收集和处理大量的数据,目标系统的实时数据需要被收集,管里和控制. 2 传统的数据包捕获机制 Inter指出,影响数据包捕获性能主要原因是系 ...
- linux下gsoap的初次使用 -- c风格加法实例
摘自: http://blog.csdn.net/jinpw/article/details/3346844 https://www.cnblogs.com/dkblog/archive/2011/0 ...
- ASP.NET Core分布式项目实战
ASP.NET Core开发者成长路线图 asp.net core 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/ ...
- iOS三方支付--微信支付/支付宝支付
一.微信支付 1.注册账号并申请app支付功能 公司需要到微信开放品台进行申请app支付功能 , 获得appid和微信支付商户号(mch_id)和API秘钥(key) . Appsecret(secr ...
- 《深度学习-改善深层神经网络》-第二周-优化算法-Andrew Ng
目录 1. Mini-batch gradient descent 1.1 算法原理 1.2 进一步理解Mini-batch gradient descent 1.3 TensorFlow中的梯度下降 ...
- hdu1698(线段树区间替换模板)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...