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 声明, 但是程序编译通过了, 奇怪
...全文
339 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
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...

65,213

社区成员

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

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