在C++primer 第4版的 15章 15.2.5中有以下这样一段提示:

“注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松。”

在vs2010中经过验证。这段话是错误的。详细见下面代码:

//Base.h
#pragma once
#include <iostream>
using namespace std;
class Base
{
public:
Base(void);
~Base(void);
size_t size()const{return n;}
protected:
//private:
size_t n;
};
//Base.cpp
#include "Base.h" Base::Base(void)
{
n = 100;
} Base::~Base(void)
{
}
//Derived.h
#pragma once
#include "base.h"
class Derived :
private Base
{
public:
Derived(void);
~Derived(void);
using Base::size;
using Base::n;
};
//Derived.cpp
#include "Derived.h" Derived::Derived(void)
{
} Derived::~Derived(void)
{
}
//main.cpp
#include "Base.h"
#include "Derived.h"
#include <iostream>
using namespace std; void main()
{
Derived XX;
Base YY;
cout<<XX.size()<<endl;
cout<<XX.n<<endl;
}

这段程序是能够正常执行没有不论什么错误的。可是基类Base的成员n权限是protected。在派生类中用using将其提权到了public,这就证明了原书中的那段话是错误的。

可是当我把Base类的protected 成员 n权限改成private的时候却出现了错误,因此推測:仅仅有子类对成员具有訪问权限的时候才干改变成员的訪问级别。





后来在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm看到这样一段话:

The access rules for inheriting constructors are specified in 12.9 class.inh-ctor; otherwise all All instances of the name mentioned in a using-declaration shall be accessible. In particular, if a derived class uses a using-declaration to access a member of
a base class, the member name shall be accessible. If the name is that of an overloaded member function, then all functions named shall be accessible. The base class members mentioned by a using-declaration shall be visible in the scope of at least one of
the direct base classes of the class where the using-declaration is specified. ...





结果证明我的推測是正确的。

C++primer原书中的一个错误(派生类using声明对基类权限的影响)的更多相关文章

  1. Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)

    在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后 ...

  2. Jenkins. 安装过程中出现一个错误: No such plugin: cloudbees-folder

    安装过程中出现一个错误: No such plugin: cloudbees-folder 安装插件,有时候会报类似的错误:An error occurred during installation: ...

  3. RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接

    如果你的服务器有如下错误: “RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接.” 可能的有2种: 1:你试试能否能继续远程登陆,有可能你的远程登陆组件出现问题. 2:有人攻击 ...

  4. SpringMVC form:form的一个错误(没有传到前台绑定类)

    SpringMVC form:form的一个错误(没有传到前台绑定类) 报错信息: Neither BindingResult nor plain target object for bean nam ...

  5. K&R《C语言》书中的一个Bug

    最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...

  6. PageRank简单实现中的一个错误

    在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的.这个错误也体现出我当时对PageRank算法有理解上的偏差. 这是个什么样的错误呢?是这样的: 简单实现中计算每个 ...

  7. Visual Studio 2015在.NET Core RC2项目中的一个错误。

    更新了.NET Core RC2 之后,VS的Web Tools更新为“Preview 1”了. 这个版本有一个问题,害我折腾了一个下午. 就是在项目界面的“依赖项 - NPM”上面错误地显示了不必要 ...

  8. 安装过程中出现一个错误: No such plugin: cloudbees-folder

    上面的错误显示是,安装插件cloudbees-folder失败,是因为下载的Jenkins.war里没有cloudbees-folder插件 需要去 https://updates.jenkins-c ...

  9. Java 从原字符串中截取一个新的字符串 subString()

    Java 手册 substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串从指定索引处的字符开始,直 ...

随机推荐

  1. UVa 11045 My T-shirt suits me / 二分图

    二分图建图 判断是否是完全匹配就行 最大流也行 #include <cstdio> #include <cstring> const int MAX = 300; int a[ ...

  2. Java中Timer和TimerTask的使用

    转自:http://www.cdtarena.com/javapx/201306/8893.html java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个 ...

  3. [Boost基础]并发编程——asio网络库——同步socket处理

    网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...

  4. Eclipse用法和技巧十五:自动添加未实现方法1

    java代码中经常要实现一些接口,这个也是java代码独有的地方.实现接口,就意味着要实现这个接口中定义的方法,如果一个个去码出方法就需要记得方法名称等等,就算有内容辅助快捷键帮助,也是很麻烦的.这里 ...

  5. Mac&iOS Socket

    链接地址:http://geeklu.com/2012/01/macios-socket/ Geeklu 登录 1 Recommend 7 分享 按评分高低排序   加入讨论...         振 ...

  6. Qt之日志输出文件

    在Qt开发过程当中经常使用qDebug等一些输出来调试程序,但是到了正式发布的时候,都会被注释或者删除,采用日志输出来代替.     做过项目的童鞋可能都使用过日志功能,以便有异常错误能够快速跟踪.定 ...

  7. res/drawable目录

    在Android Eclipse项目中res/目录下包含有drawable-ldpi/,drawable-mdpi/,drawable-hdpi/,drawable-xhdpi/目录,这几个目录的后缀 ...

  8. 为什么必须是final的呢?

    一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话,那下面这种风格的代码对你来说应该不陌生: 1 2 3 4 5 6 7 8 9 public void tryUsingG ...

  9. 【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询

    作者:iamlasong 1.接口说明 通过互联网訪问,运单跟踪信息查询接口基于HTTP协议开发,接口为RESTFul风格的Web Service,信息交互过程为用户按我方提供的web service ...

  10. HTTPS的学习

    HTTPS的学习总结   HTTPS学习总结 简述 HTTPS对比HTTP就多了一个安全层SSL/TLS,具体就是验证服务端的证书和对内容进行加密. 先来看看HTTP和HTTPS的区别 我用AFN访问 ...