c++ 中同一个类的不同对象能互相访问对方的 protected 成员?

halve 2008-04-14 10:15:39
按道理来说应该是不允许才对,不过编译器(VC++ 6)竟然没有报错?
[code=c/c++]
void SHape::copy(const CBShape &sp)
{
cons(sp.GetType(), sp.IsSelected(), sp.m_bound, sp.m_nhdls, sp.m_handles);
}
[/code]
成员变量 m_... 都是 protected 声明, 但是程序编译通过了, 奇怪
...全文
286 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qmm161 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 halve 的回复:]
引用 10 楼 liveforme 的回复:
C/C++ codeclassA{protected:intmX;intmY;
};classB:publicA{public:intGetAX(A a);
};intB::GetAX(A a){returna.mX;
}
试了下,似乎是编不过,只有public才可以,请高手指点。

[code=c/c++]
class SHape {
protected:
int m_data;

public:
void copy(const SHape &sp) {
m_data = sp.m_data;
}
};
[/code]
但是这样就可以?
[/Quote]

即便是private也可以噢
halve 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 steedhorse 的回复:]
引用 5 楼 halve 的回复:
SHape 有继承 CBShape
不过不管是否有继承, 应该都无法访问吧。。。
本身就是不同的对象,难道不同对象间不是只能通过 public 修饰共享数据?

哪本书上说访问控制具体到对象上去了?
控问控制机制本身就是针对类而言的。
[/Quote]
是这样的吗。。。?
那可能我这块的理解一直有问题
不过这样做合理吗?
虽然说这个特性确实很方便,不过这样不是违背了面向对象的原则:一个实例的私有成员只有该实例自己能够修改?
晨星 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 halve 的回复:]
SHape 有继承 CBShape
不过不管是否有继承, 应该都无法访问吧。。。
本身就是不同的对象,难道不同对象间不是只能通过 public 修饰共享数据?
[/Quote]
哪本书上说访问控制具体到对象上去了?
控问控制机制本身就是针对类而言的。
halve 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liveforme 的回复:]
C/C++ codeclassA{protected:intmX;intmY;
};classB:publicA{public:intGetAX(A a);
};intB::GetAX(A a){returna.mX;
}
试了下,似乎是编不过,只有public才可以,请高手指点。
[/Quote]
[Code=c/c++]
class SHape {
protected:
int m_data;

public:
void copy(const SHape &sp) {
m_data = sp.m_data;
}
};
[/Code]
但是这样就可以?
liveforme 2008-04-14
  • 打赏
  • 举报
回复

class A{
protected:
int mX;
int mY;
};

class B: public A{
public:
int GetAX(A *a);
};

int B::GetAX(A *a){
B *b = static_cast<B *>(a);
return b->mX;
}

不知道这个对lz有没有帮助
halve 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuliang_227 的回复:]
我试过了,在linux下是编译不过的。
[/Quote]
我在 cygwin 下用 g++ 也试了下,还是可以编译
不过想来这种做法肯定是有问题的,只是有点好奇,为什么编译器会提供这样的特性
liveforme 2008-04-14
  • 打赏
  • 举报
回复

class A{
protected:
int mX;
int mY;
};

class B: public A{
public:
int GetAX(A a);
};

int B::GetAX(A a){
return a.mX;
}

试了下,似乎是编不过,只有public才可以,请高手指点。
薛定谔之死猫 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 halve 的回复:]
SHape 有继承 CBShape
不过不管是否有继承, 应该都无法访问吧。。。
本身就是不同的对象,难道不同对象间不是只能通过 public 修饰共享数据?
[/Quote]

有继承就能访问了,父类的protected在派生类中变成private,可以直接使用变量进行存取
hxingz 2008-04-14
  • 打赏
  • 举报
回复
派生类能访问基类的protect成员。
liveforme 2008-04-14
  • 打赏
  • 举报
回复
SHape 继承 CBShape, 那Shape就能用基类的protected和public成员,这是protected的作用
只有private成员是不能用的
wuliang_227 2008-04-14
  • 打赏
  • 举报
回复
我试过了,在linux下是编译不过的。
halve 2008-04-14
  • 打赏
  • 举报
回复
SHape 有继承 CBShape
不过不管是否有继承, 应该都无法访问吧。。。
本身就是不同的对象,难道不同对象间不是只能通过 public 修饰共享数据?
Leejun527 2008-04-14
  • 打赏
  • 举报
回复
你的CBShape 和SHape有没有继承关系?
xkyx_cn 2008-04-14
  • 打赏
  • 举报
回复
SHape是从CBShape继承的吧,那么CBShape的保护成员SHape是可以访问的
想要多吃饭 2008-04-14
  • 打赏
  • 举报
回复
为什么不能访问?楼上的问题没少哦清楚
kevinchj 2008-04-14
  • 打赏
  • 举报
回复
汗……
又不是private
1) 第1章:对象入门
这一章是对面向对象的程序设计(OOP)的一个综述,其包括对“什么是对象”之的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。这一章会向大家提出一些对象创建的基本问题,比如构建器、对象存在于何处、创建好后把它们置于什么地方以及魔术般的垃圾收集器(能够清除不再需要的对象)。要介绍的另一些问题还包括通过违例实现的错误控制机制、反应灵敏的用户界面的多线程处理以及连网和因特网等等。大家也会从了解到是什么使得Java如此特别,它为什么取得了这么大的成功,以及与面向对象的分析与设计有关的问题。

(2) 第2章:一切都是对象
本章将大家带到可以着手写自己的第一个Java程序的地方,所以必须对一些基本概念作出解释,其包括对象“句柄”的概念;怎样创建一个对象;对基本数据型和数组的一个介绍;作用域以及垃圾收集器清除对象的方式;如何将Java的所有东西都归为一种新数据型(),以及如何创建自己的;函数、自变量以及返回值;名字的可见度以及使用来自其他库的组件;static关键字;注释和嵌入文档等等。

(3) 第3章:控制程序流程
本章开始介绍起源于C和C++,由Java继承的所有运算符。除此以外,还要学习运算符一些不易使人注意的问题,以及涉及造型、升迁以及优先次序的问题。随后要讲述的是基本的流程控制以及选择运算,这些是几乎所有程序设计语言都具有的特性:用if-else实现选择;用for和while实现循环;用break和continue以及Java的标签式break和contiune(它们被认为是Java“不见的gogo”)退出循环;以及用switch实现另一种形式的选择。尽管这些与C和C++见到的有一定的共通性,但多少存在一些区别。除此以外,所有示例都是完整的Java示例,能使大家很快地熟悉Java的外观。

(4) 第4章:初始化和清除
本章开始介绍构建器,它的作用是担保初始化的正确实现。对构建器的定义要涉及函数过载的概念(因为可能同时有几个构建器)。随后要讨论的是清除过程,它并非肯定如想象的那么简单。用完一个对象后,通常可以不必管它,垃圾收集器会自动介入,释放由它占据的内存。这里详细探讨了垃圾收集器以及它的一些特点。在这一章的最后,我们将更贴近地观察初始化过程:自动成员初始化、指定成员初始化、初始化的顺序、static(静态)初始化以及数组初始化等等。

(5) 第5章:隐藏实现过程
本章要探讨将代码封装到一起的方式,以及在库的其他部分隐藏时,为什么仍有一部分处于暴露状态。首先要讨论的是package和import关键字,它们的作用是进行文件级的封装(打包)操作,并允许我们构建由构成的库(库)。此时也会谈到目录路径和文件名的问题。本章剩下的部分将讨论public,private以及protected三个关键字、“友好”访问的概念以及各种场合下不同访问控制级的意义。

(6) 第6章:再生
继承的概念是几乎所有OOP语言都占有重要的地位。它是对现有加以利用,并为其添加新功能的一种有效途径(同时可以修改它,这是第7章的主题)。通过继承来重复使用原有的代码时(再生),一般需要保持“基础”不变,只是将这儿或那儿的东西串联起来,以达到预期的效果。然而,继承并不是在现有基础上制造新的唯一手段。通过“合成”,亦可将一个对象嵌入新。在这一章,大家将学习在Java重复使用代码的这两种方法,以及具体如何运用。

(7) 第7章:多形性
若由你自己来干,可能要花9个月的时间才能发现和理解多形性的问题,这一特性实际是OOP一个重要的基础。通过一些小的、简单的例子,读者可知道如何通过继承来创建一系列型,并通过它们共有的基础对那个系列对象进行操作。通过Java的多形性概念,同一系列的所有对象都具有了共通性。这意味着我们编写的代码不必再依赖特定的型信息。这使程序更易扩展,包容力也更强。由此,程序的构建和代码的维护可以变得更方便,付出的代价也会更低。此外,Java还通过“接口”提供了设置再生关系的第三种途径。这儿所谓的“接口”是对对象物理“接口”一种纯粹的抽象。一旦理解了多形性的概念,接口的含义就很容易解释了。本章也向大家介绍了Java 1.1的“内部”。

(8) 第8章:对象的容纳
对一个非常简单的程序来说,它可能只拥有一个固定数量的对象,而且对象的“生存时间”或者“存在时间”是已知的。但是通常,我们的程序会在不定的时间创建新对象,只有在程序运行时才可了解到它们的详情。此外,除非进入运行期,否则无法知道所需对象的数量,甚至无法得知它们确切的型。为解决这个常见的程序设计问题,我们需要拥有一种能力,可在任何时间、任何地点创建任何数量的对象。本章的宗旨便是探讨在使用对象的同时用来容纳它们的一些Java工具:从简单的数组到复杂的集合(数据结构),如Vector和Hashtable等。最后,我们还会深入讨论新型和改进过的Java 1.2集合库。

(9) 第9章:违例差错控制
Java最基本的设计宗旨之一便是组织错误的代码不会真的运行起来。编译器会尽可能捕获问题。但某些情况下,除非进入运行期,否则问题是不会被发现的。这些问题要么属于编程错误,要么则是一些自然的出错状况,它们只有在作为程序正常运行的一部分时才会成立。Java为此提供了“违例控制”机制,用于控制程序运行时产生的一切问题。这一章将解释try、catch、throw、throws以及finally等关键字在Java的工作原理。并讲述什么时候应当“掷”出违例,以及在捕获到违例后该采取什么操作。此外,大家还会学习Java的一些标准违例,如何构建自己的违例,违例发生在构建器怎么办,以及违例控制器如何定位等等。

(10) 第10章:Java IO系统
理论上,我们可将任何程序分割为三部分:输入、处理和输出。这意味着IO(输入/输出)是所有程序最为关键的部分。在这一章,大家将学习Java为此提供的各种,如何用它们读写文件、内存块以及控制台等。“老”IO和Java 1.1的“新”IO将得到着重强调。除此之外,本节还要探讨如何获取一个对象、对其进行“流式”加工(使其能置入磁盘或通过网络传送)以及重新构建它等等。这些操作在Java的1.1版都可以自动完成。另外,我们也要讨论Java 1.1的压缩库,它将用在Java的归档文件格式(JAR)。

(11) 第11章:运行期型鉴定
若只有指向基础的一个句柄,Java的运行期型标鉴定(RTTI)使我们能获知一个对象的准确型是什么。一般情况下,我们需要有意忽略一个对象的准确型,让Java的动态绑定机制(多形性)为那一型实现正确的行为。但在某些场合下,对于只有一个基础句柄的对象,我们仍然特别有必要了解它的准确型是什么。拥有这个资料后,通常可以更有效地执行一次特殊情况下的操作。本章将解释RTTI的用途、如何使用以及在适当的时候如何放弃它。此外,Java 1.1的“反射”特性也会在这里得到介绍。

(12) 第12章:传递和返回对象
由于我们在Java对象沟通的唯一途径是“句柄”,所以将对象传递到一个函数里以及从那个函数返回一个对象的概念就显得非常有趣了。本章将解释在函数进出时,什么才是为了管理对象需要了解的。同时也会讲述String(字串)的概念,它用一种不同的方式解决了同样的问题。

(13) 第13章:创建窗口和程序片
Java配套提供了“抽象Windows工具包”(AWT)。这实际是一系列的集合,能以一种可移植的形式解决视窗操纵问题。这些窗口化程序既可以程序片的形式出现,亦可作为独立的应用程序使用。本章将向大家介绍AWT以及网上程序片的创建过程。我们也会探讨AWT的优缺点以及Java 1.1在GUI方面的一些改进。同时,重要的“Java Beans”技术也会在这里得到强调。Java Beans是创建“快速应用开发”(RAD)程序构造工具的重要基础。我们最后介绍的是Java 1.2的“Swing”库——它使Java的UI组件得到了显著的改善。

(14) 第14章:多线程
Java提供了一套内建的机制,可提供对多个并发子任务的支持,我们称其为“线程”。这线程均在单一的程序内运行。除非机器安装了多个处理器,否则这就是多个子任务的唯一运行方式。尽管还有别的许多重要用途,但在打算创建一个反应灵敏的用户界面时,多线程的运用显得尤为重要。举个例子来说,在采用了多线程技术后,尽管当时还有别的任务在执行,但用户仍然可以毫无阻碍地按下一个按钮,或者键入一些文字。本章将对Java的多线程处理机制进行探讨,并介绍相关的语法。

(15) 第15章 网络编程
开始编写网络应用时,就会发现所有Java特性和库仿佛早已串联到了一起。本章将探讨如何通过因特网通信,以及Java用以辅助此编程的一些。此外,这里也展示了如何创建一个Java程序片,令其同一个“通用网关接口”(CGI)程序通信;揭示了如何用C++编写CGI程序;也讲述了与Java 1.1的“Java数据库连接”(JDBC)和“远程方法调用”(RMI)有关的问题。

(16) 第16章 设计范式
本章将讨论非常重要、但同时也是非传统的“范式”程序设计概念。大家会学习设计进展过程的一个例子。首先是最初的方案,然后经历各种程序逻辑,将方案不断改革为更恰当的设计。通过整个过程的学习,大家可体会到使设计思想逐渐变得清晰起来的一种途径。

(17) 第17章 项目
本章包括了一系列项目,它们要么以本书前面讲述的内容为基础,要么对以前各章进行了一番扩展。这些项目显然是书最复杂的,它们有效演示了新技术和库的应用。
有些主题似乎不太适合放到本书的核心位置,但我发现有必要在教学时讨论它们,这些主题都放入了本书的附录。

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧