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. oracle表空间tablespace

    用户:用户是在实例下建立的.不同实例可以建相同名字的用户. 表空间:表空间是一个用来管理数据存储逻辑概念,表空间只是和数据文件(ORA或者DBF文件)发生关系,数据文件是物理的,一个表空间可以包含多个 ...

  2. Python - 三级菜单优化方法 (单层循环)

    menu = {...... } current_layer = menu layers = [] while True: for k in current_layer: print(k) choic ...

  3. Python中socket经ssl加密后server开多线程

            前几天手撸Python socket代码,撸完之后经过ssl加密,确保数据的安全,外加server端开启多线程保证一个客户端连接有一个线程来服务客户端,走了不少的弯路,网上的信息啥的要 ...

  4. 如何为 Vue 项目写单元测试

    https://www.w3ctech.com/topic/2052 如何为 Vue 项目写单元测试 前端工程 明非 2017-07-18 4685 访问 1 分享 微信分享 译者:明非 链接:htt ...

  5. (转)Systemd 入门教程:命令篇

    Systemd 入门教程:命令篇 原文:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html Systemd 入门 ...

  6. HtmlUnit 开发网络爬虫

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,几行代码就OK啦! 通常在一个页面中会包含别的Url,在别的Url当中又会包含更多的Url. ...

  7. 【c++】iostreeam中的类为何不可以直接定义一个无参对象呢

    缘起 #include <iostream> #include <fstream> #include <sstream> using namespace std; ...

  8. golang 读取一行

    //读取一行 func myReadLine(paths string) error { //先获取到文件信息 fileinfo, err := os.Stat(paths) if err != ni ...

  9. Django的学习基础1

    著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. Django的MTV模式本质上与MVC模式没有什么差别,也是 ...

  10. 关于vue的常识问题及解决方法

    一.VSCode开发必备插件 1.Beautify:语法高亮: 2.Bracket Pair Colorizer :对括号对进行着色: 3.ESLint:ESLint插件,高亮提示: 4.HTML C ...