• 关于派生类访问基类对象的保护变量的问题 --Coursera


    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
     
     
     
     
    这个岂止反直觉,简直感觉反人类......我暂时也不知道怎么回事。
     
    0votes received.
     
    · flag
     
     
    (活捉
     
    0votes received.
     
    · flag
     
     
    C++里,类的访问权限是针对类的,不是针对对象的。
    访问权限只在编译时对编译器有效
     
    0votes received.
     
    · flag
     
     
    没理解刘老师的问题。我觉得应该是针对对象的啊。class myclass;myclass a是没法访问myclass b的私有成员啊?
     
    0votes received.
     
    · flag
     
     
     
    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/
  • 相关阅读:
    putty的复制 技巧
    linux下的yum命令详解
    mysql修改密码
    我的阅读编程书籍的好方法
    WINDOWS下VIM配置
    Debian下VSFTPD配置
    一个远程访问MySQL的错误(2003, 10061)的解决
    auto_increment
    hello,world!
    scss文件中使用深度选择器/deep/报错 Expected selector Jim
  • 原文地址:https://www.cnblogs.com/forcheryl/p/3961161.html
Copyright © 2020-2023  润新知