https://class.coursera.org/pkupop-001/forum/thread?thread_id=350

在课件中我们知道如下程序是不能编译通过的:

class A{
protected:
int x;
};
class B:A{
void foo(){
A a;
a.x=1;
}
};

原因就在于x被protected了,所以在B类中不能访问A的对象的变量。
但是如下程序可以编译通过:

class A{
protected:
int x;
};
class B:A{
void foo(){
B a;
a.x=1;
}
};

这一点非常反直觉,不是吗?明明A是B的基类,权限理应比B大,但是反而需要用B类才行。
而且两个对象仅仅因为属于同一个类,就可以互相访问对方的private/protected变量,这好比“喂你怎么乱动我私人物品”“因为我们是同一个班的啊”,怎么看都很反直觉吧……
据说Java也是如此,为何要设计成这样?有没有能让我信服的解释?

 

0votes received.

 

· flag

 
 

对单个类而言,protected和private是一样的。

 

0votes received.

 

· flag

 
 
 
同问类似问题,C++当中为何设计成能使一个类的内部成员函数访问所有该类变量的private成员?怎么想怎么不科学 ……就像如下的<重载一样。

class A {
public:
bool operator < (const A& o) const {
return a < o.a;
}
private:
int a;
}
 

0votes received.

 

· flag

 
 
 

如果把foo放在外面还可以编译通过吗? 怀疑是编译器的bug?

还是也有可能是为了实现石同学的说法才这么设计的?

 

0votes received.

 

· flag

 
 
 
 
郭炜INSTRUCTOR· 6 months ago
这个岂止反直觉,简直感觉反人类......我暂时也不知道怎么回事。
 

0votes received.

 

· flag

 
(活捉
 

0votes received.

 

· flag

 
C++里,类的访问权限是针对类的,不是针对对象的。
访问权限只在编译时对编译器有效
 

0votes received.

 

· flag

 
没理解刘老师的问题。我觉得应该是针对对象的啊。class myclass;myclass a是没法访问myclass b的私有成员啊?
 

0votes received.

 

· flag

 
 
 
Anonymous· 6 months ago
A a.x 在 foo() 里面是试图通过A类的public界面来访问一个局部变量a的protected成员x,自然是不行的。
而B a.x在 foo() 里面是试图通过B类的private界面(因为foo()是B类的成员函数)和对A类的public继承来访问x,自然是允许的。

当然C++有太多变态的设计,这个根本不算什莫。有兴趣的可以去这个网站看看
http://www.yosefk.com/c++fqa/

关于派生类访问基类对象的保护变量的问题 --Coursera的更多相关文章

  1. c++ 派生类向基类转换的可访问性

    对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...

  2. c++中派生类对基类成员的三种访问规则(转)

    C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...

  3. C++ 派生类到基类转换的可访问性

    今天看c++ primer关于派生类到基类转换的可访问性,看的很晕,看了下面的文章恍然大悟: http://www.2cto.com/kf/201403/283389.html C++ primer第 ...

  4. c++ primer 学习杂记2【派生类到基类转换的可访问性】

    参考: http://blog.csdn.net/rehongchen/article/details/7930853 http://blog.csdn.net/ming_road/article/d ...

  5. cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法

    //*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...

  6. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...

  7. C++_派生类的构造函数及派生类和基类之间的特殊关系

    派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. //声明一个基类 class TableTennisPlayer { p ...

  8. c++——派生类和基类转换(类型兼容性原则)

    基类也叫父类,派生类也叫子类. 类之间的继承关系继承关系是类之间的父子关系. 继承关系的特点如下:A. 子类拥有父类的所有属性和行为B. 子类也是一种特殊的父类C. 子类对象可以当父类对象使用D. 子 ...

  9. C++中派生类使用基类成员的问题

    在C++中,派生类在定义构造函数时,会调用基类构造函数首先完成基类部分的构造: class Derive : public Base { public: Derive(string nam, int ...

随机推荐

  1. python3 zip压缩

    参考: https://docs.python.org/3/library/zipfile.html https://zhidao.baidu.com/question/149840976436638 ...

  2. CSAPP阅读笔记-存储器层次结构-第六章-P400-P462

    6.1 存储技术 1.随机访问存储器(RAM),是易失性存储器,掉电存储信息会丢失,与之相对的是非易失性存储器(ROM),它掉电后存储信息不丢失,但前者访问速度较快,但容量有限,通常只有几百或几千兆字 ...

  3. 解决centos被minerd挖矿程序入侵方法

    记录一次服务器被入侵的解决方法 一:问题说明 1.我的服务器是使用的阿里云的CentOS,收到的阿里云发来的提示邮件如下 然后我查看了运行的进程情况(top 命令),看到一个名为minerd的进程占用 ...

  4. openerp学习笔记 模块结构分析

    以OpenERP7.0中的 hr_expense 模块为例: 如图中代码所示: __init__.py :和普通 Python 模块中的__init__.py 作用相同,主要用于引用模块根目录下的.p ...

  5. intellij idea NoClassDefFoundError javax.swing.UIManager

    今天启动idea报 NoClassDefFoundError javax.swing.UIManager 可是明明配置好了java 环境 ,后来仔细想了一下只配置了java的bin目录在PATH里 随 ...

  6. js中的闭包理解一

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  7. Unity Github 项目收集

    http://gad.qq.com/article/detail/24048 重磅推荐: Github 热门 Unity Assets 查询:http://unitylist.com/browse 最 ...

  8. MySQL的模糊搜索

    1.模糊搜索 第一时间我马上想到了关键字 like 1.1.所要查询的字段中包含特定 字符,但不确定其位置,使用两个%包起来 select * from phone where provider li ...

  9. Spring初始化日志

    Spring启动时的日志: 2013-11-22 14:55:59:319[INFO]: FrameworkServlet 'spring3': initialization completed in ...

  10. bat执行java程序 good

    start.bat set MY_HOME=%~dp0  set JMS_BINDING_PATH=%MY_HOME%..\binds set JAVA_HOME=C:\Program Files\J ...