《C++Primer》第三版P804,有关在类中使用using声明的问题

lw1a2 2006-10-04 10:39:59
今天在看一个帖子的时候,发现的一个问题。书上说:

“派生类只能将继承得到的成员恢复到原来的访问级别,该访问级别不能比基类中原来指定的级别更严格或更不严格。”

但是如下程序却没有错误:

#include <iostream>
using namespace std;

class B
{
protected:
void f()
{
cout<<"B"<<endl;
};
};

class D : private B
{
public:
using B::f;

};

int main()
{
D d;
d.f();

system("pause");
}

何解?
第四版里也没有明确说明,或者谁知道C++标准里怎么说,给我指指,谢谢
...全文
242 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicholasfor 2006-10-05
  • 打赏
  • 举报
回复
我说的不对。
lw1a2 2006-10-04
  • 打赏
  • 举报
回复
这个问题我大概明白了,28分太少,我去加分
Dan1980 2006-10-04
  • 打赏
  • 举报
回复
to 楼主:15.3.2.2小节
lw1a2 2006-10-04
  • 打赏
  • 举报
回复
TO:Arthur_(凉咖啡)

和你理解的不一样,这里是改变访问级别
Arthur_ 2006-10-04
  • 打赏
  • 举报
回复
“不能通过使用声明(即通过using...,本人注)取得对更多信息的访问权。使用声明只是一种能使信息的使用更方便的机制。在另一方面,如果某种访问可行,就可以将它授予其他用户。”

对于这段话,结合后面的例子,我是这样理解的:
使用using...,可以将基类中对派生类公开的成员(public和protected成员)重新授予任何其他访问级别,但不能指望可以通过使用using...来获得对父类中private成员的访问。

==================================================================
對於你的理解mark一下,waiting for next
Arthur_ 2006-10-04
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class B
{
protected:
void f()
{
cout<<"B"<<endl;
};
};

class D : private B
{
public:
using B::f; //如果把這句去了,程序應該除錯了吧,我沒有測試.我想說的是這樣的寫法是不是和下面的類一樣.你看看下面的

};

int main()
{
D d;
d.f();

system("pause");
}
=================================
class test{
private:
f();
public:
f()
};
lw1a2 2006-10-04
  • 打赏
  • 举报
回复
楼上说的

“不能通过使用声明(即通过using...,本人注)取得对更多信息的访问权。使用声明只是一种能使信息的使用更方便的机制。在另一方面,如果某种访问可行,就可以将它授予其他用户。”

在哪节?我去找找,我只有英文版
Dan1980 2006-10-04
  • 打赏
  • 举报
回复
《The C++ Programming Language》还指出说,“声明一些protected的数据成员往往都是设计错误”,我想这是因为一旦派生类获得了对它们的访问,这种访问就有可能被扩大;但使用protected函数却是“描述供派生类使用的操作的极好方式”,这又不知作何解了。

希望能有高手出来解释。
Dan1980 2006-10-04
  • 打赏
  • 举报
回复
我也觉得《C++ Primer》中的这句话是有问题的,原文是这样:

“The derived class can restore the access level of an inherited member. The access level cannot be made more or less restrictive than the level originally specified within the base class.”

译文和原文的意思基本没有出入,但读起来让人一头雾水。

对于使用using来改变基类成员的访问级别,《The C++ Programming Language》(裘宗燕译)中是这样说的:

“不能通过使用声明(即通过using...,本人注)取得对更多信息的访问权。使用声明只是一种能使信息的使用更方便的机制。在另一方面,如果某种访问可行,就可以将它授予其他用户。”

对于这段话,结合后面的例子,我是这样理解的:
使用using...,可以将基类中对派生类公开的成员(public和protected成员)重新授予任何其他访问级别,但不能指望可以通过使用using...来获得对父类中private成员的访问。

因此,楼主的程序是可以编译的,因为派生类可以访问基类的protected成员,从而可以使用using...来“将它授予其他用户”,即扩大为public;同时,通过using来缩小访问级别也是可行的,试一下就知道。
lw1a2 2006-10-04
  • 打赏
  • 举报
回复
我的理解是恢复到基类的访问级别,如原先是public,现在也是public
不能和原先的不一致
xuqing1980 2006-10-04
  • 打赏
  • 举报
回复
那楼上的有没有正确的解答呢??
Arthur_ 2006-10-04
  • 打赏
  • 举报
回复
更严格或更不严格。-->啥意思,到底是嚴格還是不嚴格
lw1a2 2006-10-04
  • 打赏
  • 举报
回复
楼上说的不对
nicholasfor 2006-10-04
  • 打赏
  • 举报
回复
D继承了B,D当然可以访问B的protected成员。所参d.f()没错。
封装性是指其它函数访问该类时体现的。也就是D或B以外的类访问f时才会受限制,而D自己访问当然不会受限。

64,670

社区成员

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

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