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 声明, 但是程序编译通过了, 奇怪
...全文
231 16 打赏 收藏 举报
写回复
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
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-14 10:15
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下