C++中访问控制

c++派生类的访问控制 1继承概念 面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。我们已经讲解了类和对象,了解了面向对象程序设计的两个重要特征一数据抽象与封装,已经能够设计出基于对象的程序,这是面向对象程序设计的基础。 要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特 征——继承性和多态性。本章主要介绍有关继承的知识,多态性将在后续章节中讲解。 继承性是面向对象程序设计最重要的特征,可以说,如果没有掌握继承性,就等于没有掌握类和对象的精华,就是没有掌握面向对象程序设计的真谛。 1.1类之间的关系 阅读详情

文章来源:http://blog.163.com/zhaoxin851055@126/blog/static/8112929820092514256782/

1 #include <iostream>
2 using namespace std;
3 
4 class A{
5 public:
6      A(int i_,int j_)
7      {
8          i=i_;
9          j=j_;
10      }
11      void disp(A &a)
12      {
13          cout<<a.i<<endl<<a.j<<endl;
14      }
15 
16 private:
17      int i;
18 protected:
19      int j;
20 };
21 
22 int main(int argc, char* argv[])
23 {
24      A a(123,456);
25      A b(789,543);
26      a.disp(b);
27      b.disp(a);
28 
29      return 0;
30 }

初看起来,倒是会产生疑问。为什么会这样,是否有bug?
仔细考究起来,我们其实可以这样看待类和对象:
类是将数据成员和进行于其上的一系列操作(成员函数)封装在一起,注意:成员函数可以操作数据成员(可以称类中的数据成员为泛数据成员)!
对象是类的实例化,怎样理解实例化?其实每一个实例对象都只是对其中的数据成员初始化,内存映像中每个对象仅仅保留属于自己的那份数据成员副本。而成员函数对于整个类而言却是共享的,即一个类只保留一份成员函数。
那 么每个对象怎样和这些可以认为是“分离”的成员函数发生联系,即成员函数如何操作对象的数据成员?记住this指针,无论对象通过(.)操作或者(- >)操作调用成员函数,编译时刻,编译器都会将这种调用转换成我们常见的全局函数的形式,并且多出一个参数(一般这个参数放在第一个),然后将 this指针传入这个参数。于是就完成了对象与成员函数的绑定(或联系).
实例化后就得到同一个类的多个不同的对象,既然成员函数共享的,那么成员函数就可以操作对象的数据成员。
问题是现在有多个对象,成员函数需要知道操作的是哪个对象的数据成员?
比如有对象obj1和obj2,都属于A类,A类有public成员函数foo()
如果obj1调用该函数,编译时会给foo函数传入this指针,obj1,foo中操作obj1自身的成员就不用任何修饰,直接访问,因为其中的数据成员自动根据this指针找到。
如果obj1调用该函数,同样可以访问同类的其他对象的数据成员!那么你需要做的是让foo函数知道是同类对象中哪个对象的数据成员,一个解决办法是传入同类其他对象的指针或引用,那么就可以操作同类其他对象的数据成员。
foo(A &obj)
这样定义,然后调用:
obj1.foo(obj2)
就可以在obj1访问obj2的数据成员,而无论这些数据成员是private还是protected

搬出C++ Object Model,可以画出各个对象的内存map就可以更清晰的看出:


总结:C++的访问修饰符的作用是以类为单位,而不是以对象为单位。

通俗的讲,同类的对象间可以“互相访问”对方的数据成员,只不过访问途径不是直接访问.
步 骤是:通过一个对象调用其public成员函数,此成员函数可以访问到自己的或者同类其他对象的public/private/protected数据成 员和成员函数(类的所有对象共用),而且还需要指明是哪个对象的数据成员(调用函数的对象自己的成员不用指明,因为有this指针;其他对象的数据成员可 以通过引用或指针间接指明)

C++
中public,protected,private访问小结
第一:private,public,protected方法的访问范围.(public继承下)
private: 
只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问. 
protected: 
可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问 
public: 
可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问
注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数

第二:类的继承后方法属性变化: 
使用private继承,父类的所有方法在子类中变为private; 
使用protected继承,父类的protected和public方法在子类中变为protected,private方法不变; 
使用public继承,父类中的方法属性不发生改变;

 

public:

protected:

private:

public继承

public

protected

---

protected继承

protected

protected

---

private继承

private

private

---


protected继承和private继承能降低访问权限

再次提到:可以提供访问行为的主语为“函数”。
类体内的访问没有访问限制一说,即private函数可以访问public/protected/private成员函数或数据成员,同理,protected函数,public函数也可以任意访问该类体中定义的成员
public
继承下,基类中的public和protected成员继承为该子类的public和protected成员(成员函数或数据成员),然后访问仍然按类内的无限制访问

对于类域范围内,成员函数访问无所谓访问限制。
对于继承情况下的基类private成员,在派生类中仍然继承了下来,只不过它不能直接访问, 即使在类里也不行, 更不用说是类对象了。
可以通过下列例子看到:

1 #include <iostream>
2 using namespace std;
3 
4 class C{
5 public:
6      C(int val) : m_c(val) {}
7 private:
8     int m_c;
9 };
10 
11 class D: public C{
12 public:
13      D(int val1, int val2) : C(val1), m_d(val2) {}
14     int m_d;
15 };
16 
17 int main()
18 {
19 
20 
21      cout << sizeof(C) << " " << sizeof(D) << endl; // 4   8
22      D obj(2, 25);
23      cout << &obj << " " << &obj.m_d << endl; //0x0012FF78    0X0012FF7C
24     //cout << obj.m_c; //error, 
不能访问
25 
26      D *ptr = &obj;
27     int *iptr = (int *)ptr;
28      cout << *iptr << " " << *(iptr+1) << endl;//2   25
29     
30     return 0;
31 }
32 
33


同样,加入虚函数,可以看到VC编译器将vptr放置在数据区的最开头


下面摘自博客园的一篇,相当精辟的理解:



 

下面这个问题摘自论坛的一个帖子:

已知3个类O、P和Q,类O中定义了一个私有方法F1、一个公有方法F2和一个受保护的方法F3:类P和类Q是类O的派生类,其继承方式如下所示: 
class P : protected O {…}; 
class Q : public O {…};
关于方法F1的描述中正确的是___(34)___;关于方法F2韵描述中正确的是___(35)___;关于方法F3的描述中正确的是___(36)___。 
(34)
A
.方法F1无法被访问 
B
.只有在类O内才能访问方法F1 
C
.只有在类P内才能访问方法F1 
D
.只有在类Q内才能访问方法F1 
(35)
A
.类O、P和Q的对象都可以访问方法F2 
B
.类P和Q的对象都可以访问方法F2 
C
.类0和Q的对象都可以访问方法F2
D
.只有在类P内才能访问方法F2 
(36)A
.类0、P和Q的对象都可以访问方法F3 
B
.类0、P和Q的对象都不可以访问方法F3 
C
.类0和Q的对象都可以访问方法F3 
D
.类P和Q的对象都可以访问方法F3。

有甚么办法可以简单地记住这许多的规则? 下文告诉你一个根本不需要记的办法。

顾名思义,private/public/protected 分别表示 私有/公开/保护,它们是一组用于访问权限控制的关键字。那么首先,需要澄清的一个关键点是,是要控制谁访问谁的权限?这个访问的主语(施事)是谁?宾语(受事)是谁?

我们经常听到这样的说法:

1)一个类友元可以访问该类的任何成员(包括成员变量及成员方法,下同)。
2
)private成员只有该类自身可以访问,protected成员只有该类及其派生类可以访问,public成员所有的人都可以访问。

宾语(受事)是谁这一点很明确,是类的成员(包括成员变量及成员方法)。主语(施事)是谁?这是让大家发生混淆的关键点。也是这个说法中含糊不清的地方。

想清楚一点,其实主语(施事)指的是一个函数,而不是类(当然更不是变量)。private/public/protected要控制的是一个函数(施事)对一个类的成员(包括成员变量及成员方法)的访问权限。因此比较完整的说法是:

1)一个类友元(包含友元函数或者友元类的所有成员函数)可以访问该类的任何成员(包括成员变量及成员方法)。

2)除去友元外,private成员只有该类自身的成员函数可以访问,protected成员只有该类的成员函数及其派生类的成员函数可以访问,public成员则所有的函数都可以访问。

也就是说,当我们说一个类可以访问XXX,其实暗指这个类的成员函数可以访问XXX。了解了这一点,外加一条显而易见的规则,上面的问题就不难回答了。这条规则是:

3)派生类在继承时可削弱成员的访问权限(通过protected/private修饰)。例如上面的例子class P : protected O {…}; 那么某个函数通过类P访问O中成员时,该函数对类O中的public成员只有protected权限。

补充:有一种技术叫Member Spy(类成员间谍),通过该技术派生类可将基类的protected成员修改为public权限。这种技术用到了using关键字。举例如下:

class A
{
protected:
int m_data;
};

class SpyA : public A
{
public:
using A::m_data;
};

void TestSpy(A* pA)
{
SpyA* pSpyA = static_cast<SpyA*>(pA); 
// 
强制转换A为SpyA,这要求SpyA没有成员变量且没有重载A中的虚函数。
// 
现在你可以通过pSpyA访问m_data了。例如:int data = pSpyA->m_data;
}

由于这种技术用到了强制类型转换,当谨慎使用。


c++访问控制说明符 1.类的成员的访问控制说明符用于控制类的使用者对类中成员的访问权限 2.派生列表中的访问控制说明符用于控制派生类的使用者对派生类从基类继承的成员的访问权限 /* 基类中成员的访问控制说明符就是控制派生类与基类的用户对基类的访问权限。而派生类定义时使用的派生列表中的访问控制说明符与派生类对基类成员的访问没有任何关系,它控制的是派生类的派生类和派生类用户(即派生类的使用者)对派生类从基类继承的成员的访问权限 */ 1)类的成员访问控制说明符 如果派生类的成员和友元能直接访问基类对象的protected成员,那 阅读详情

相关推荐

c++ 访问控制与封装

访问控制与封装 文章目录访问说明符:友元:封装好处: class Sales_data{ public://作为接口的一部分,构造函数和部分成员函数isbn,combine紧跟在public说明符之后。 Sales_data() = default; Sales_data(const std::string &s, unsigned n, double p...

及时总结 444

【Java入门】Java中main函数调用同类中的其他方法

大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。

尹煜的博客 1万+

戴尔笔记本装Ubuntu 20.04,别急着分区!先搞定这个BIOS设置(Intel RST避坑指南)

本文详细介绍了在戴尔笔记本上安装Ubuntu 20.04时遇到的Intel RST技术兼容性问题及解决方案。通过安全切换至AHCI模式,避免安装过程中找不到硬盘的常见问题,并提供双系统分区策略和安装后的优化建议,确保Ubuntu与Windows 10双系统稳定运行。

weixin_31315567的博客 268

重构笔记-00-重构手法预览

目录 重新组织代码 Extract Method(提炼函数)110 情况:你有一段代码可以被组织在一起并独立出来。 概述:将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。 Inline Method(内联函数)117 情况:一个函数的本体与名称同样清晰易懂。 概述:在函数调用点插入函数本体,然后移除该函数。 Inline Temp(内联临时变量)119 情况:你有一个临时变量,只被一个...

白M的博客 619

Potplayer + LAVFilters + madVR 配置教程

文章目录Potplayer + LAVFilters + madVR 配置教程工具安装篇设置调教1.potplayer播放器设置加载LAVFilters和madVR1.选择“源滤镜/分离器”选项,选择“滤镜/解码器管理”2.“添加外部滤镜”3.浏览到刚才LAVFilters解压的文件夹,分别添加图示项。4.添加后回到管理界面设置,点击左边的”LAV AudioDecoder”,将右边”音频解码器”...

re 16万+

自动驾驶预测决策规划八股

预测规划八股个人总结。

dawushixiange的博客 479

重构方法

一、重新组织函数 1、Extract Method (提炼函数) 你有一段代码可以被组织在一起并独立出来。将这段代码放进一个独立函数,并让函数名称解释该函数的用途。 2、Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂。在函数调用点插入函数体,然后移除该函数。 3、Inline Temp (内联临时变量) 你有一个临时变量,只被一个简单表达式赋值一次,而它

小青年儿 1701

【乐企-工具篇】生成发票左上角二维码

【代码】【乐企-业务篇】生成发票左上角二维码。

九七的博客 707

@Transaction注解方法被同一类其他方法调用时注解失效问题

问题描述 通常利用spring提供的注解@Transactional完成事务管理机制是如今最行之有效的方法。但当某方法调用同类其他方法时,即使被调用的方法添加注解仍会失效。 ///未使用注解方法调用同类注解方法,注解失效!!!! public class TransDemo{ public void editInfo(){ addInfo(); } @Transactional pub...

weixin_39736879的博客 1459

视觉-语言模型:BLIP与Flamingo如何理解图文?

视觉-语言模型:BLIP与Flamingo如何理解图文? ,人工智能,计算机视觉,大模型,AI,在当今人工智能飞速发展的时代,视觉 - 语言模型作为多模态领域的关键技术,正逐渐改变着我们与数字世界交互的方式。它们致力于打破图像与文本之间的模态壁垒,使计算机能够像人类一样,综合理解和处理视觉与语言信息。其中,BLIP 和 Flamingo 两款模型脱颖而出,以独特的架构和创新的训练方法,在图像描述生成、视觉问答、图文检索等任务中展现出卓越的性能。本文将深入剖析 BLIP 与 Flamingo 模型的工作原理。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1930

重构·改善既有程序的设计总结(代码重构技巧)

重构本来就不是一件应该特别拨出时间做的事情,重构应该随时随地的进行。 何时重构? 1、重复代码 同一个类中有相同的表达式:提炼出重复的代码,然后让两个地方都调用被提炼出来的那一段代码; 两个互为兄弟的子类内含有相同的表达式:提炼出相同代码,将它推入超类内; 两个毫不相干的类中出现:将重复的代码提炼到一个独立的类中。 代码之间相似,并非完全相同:使用模板函数,用方法名统一差异推入超类,子...

empyan的博客 1011

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 404

Casbin-CPP:强大的C++访问控制框架

Casbin-CPP:强大的C++访问控制框架 项目介绍 Casbin-CPP 是 Casbin 访问控制框架的C++实现版本。Casbin是一个开源的访问控制库,支持多种访问控制模型,如ACL、RBAC、ABAC等。Casbin-CPP继承了Casbin的核心功能,并针对C++语言特性进行了优化,使其在C++项目中能够高效、灵活地实现访问控制。 Casbin-CPP不仅支持Windows、Lin...

gitblog_00196的博客 849

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2587

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ 访问控制

什么是访问控制 C++标准中定义了三种类成员访问控制符 public, protected和private,分别译为公有的、保护的、私有的 这是在类的内部声明这三种控制符的意思 为什么需要访问控制 访问控制就是C++提供的一种用来保护类里的方法和属性的手端 保护-对谁可以调用某个方法和访问某个属性加上一个限制 如果某个对象试图调用一个它无权进行访问的函数 编译器将报错 控制符访问特点 (1)public成员:能被 本类的成员函数 (此类中任何类型的控制符声明的成员函数都可以访问)、友元函数、本类的对象、

Chroniccandy的博客 1266

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++成员访问控制,以及C++继承方式对成员访问控制的影响

1、C++成员访问控制 Public:能通过类的对象在用户代码中访问,能在类内部成员函数中访问,能被友元函数(类)访问。 Protected:能在类内部成员函数中访问,能被友元函数(类)访问。但不能通过类的对象在用户代码中访问, Private:访问方式同protected

z568954956的专栏 844

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C++】类成员访问控制

本文深入解析C++访问控制机制,重点阐述private、protected和public三个关键字的使用场景与设计原则。private是默认选择,用于隐藏实现细节,保证数据安全;protected为继承设计,但需谨慎使用以避免破坏封装;public定义稳定接口,应保持最小化。核心设计准则包括:默认私有原则、审慎保护原则、最小公共接口原则和数据私有化原则。合理运用访问控制能有效提升代码的封装性、可维护性和安全性,是高质量C++程序的重要保障。

2301_81559955的博客 1081

C++ VS Java 系列 —— 访问控制

访问控制   C++和Java均具有封装概念,所以也有面向对象所具有的封装中的访问控制,这些访问控制在C++中只区分类内、类外、父子类,而在Java中进行了合理的保留和舍弃,将区分扩展到了包级,类似于C++中的命名空间。 一、针对类的成员访问控制符   C++:private(class默认)、protected、public(struct默认)   Java:priv...

a6217815的博客 234

C++类的访问控制

前言C++类中关于访问说明符的关键字是public,protected和private,由于C++的继承的访问说明符不同,这里会牵扯出非常多不同的情况,本文尝试对此进行整理无继承public,protected和private这三个访问说明符其实是针对使用该类的代码而言的,如下class Test { public: int a; protected: int b; private:

北极星 2778

C++类成员的访问控制

本篇文章介绍C++类成员的访问控制。

b1049112625的博客 1730

Cpp4 类成员的访问控制

好的编程习惯 -定义和实现分开 代码会有更好的可读性 但不是必须的 在头文件中只留下声明代码 Test.h struct sclass { int x; int y; int Bigger(int x,int y); int Max(int x,int y,int z); }; Test.cpp int sclass::Bigger(int x,i...

weixin_33901843的博客 245

C++实操 - 访问控制

C++的基本操作对象是类和对象,类是模板,对象是类的实例。 在类中,声明了private、protected和public,用来区分不同的访问级别。 对于类内部访问的级别来说,public一般指接口访问,private为实现访问。而Protected为可继承的实现。 private是私有的成员变量或成员函数,只能本类或对象调用。 protected表示继承级别的访问,用来表示子类可以调用基类的成员变量或函数。 public是全局访问权限,类的内部外部都可以访问。 关于private的访问..

guoqx的专栏 1122

C++类访问控制及继承

一、C++类的访问控制有三类:public,protected和private。 类访问控制符 类成员可被哪些对象访问 public 1、类的成员函数。2、类对象。3、友元。4、子类成员函数 protected 1、类的成员函数。2、友元。3、子类成员函数 private 1、类的成员函数。2、友元 二、C+

2192

C++访问控制

在c++中有三种访问控制说明符:public 、protected 、private 一、访问类中成员情况: private: 只允许类内成员函数和友元函数访问,不允许类的对象访问; protected:只允许类内成员函数、子类内成员函数和友元函数访问,不允许类的对象访问; public: 允许类内成员函数、子类内成员函数、友元函数和类的对象访问。 二、继承中的情况: priv

清空 592

C++访问控制的权限

   所谓访问控制,就是C++提供一种用来保护类里面的方法和属性的手段。其实这里的保护的意思是对谁可以调用某个方法或者某个属性加上一个限制。例如:class Base //类 { public: //加上限制 int a; protected:: //加上限制 int b; private: //加上限制 int c; ...

qq_34692743的博客 680
上一篇: C & C++ 作用域的概念
下一篇: 板级文件中的struct resource结构体
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值