首页 文章

私人和受保护成员:C

提问于
浏览
231

有人可以告诉我类中的 privateprotected 成员之间的区别吗?

我从最佳实践约定中了解到,不应该在类外部调用变量和函数 private - 但是看看我的 MFC 项目, MFC 似乎更喜欢 protected .

有什么区别,我应该使用哪个?

16 回答

  • 115

    当然看看Protected Member Variables问题 . 建议使用private作为默认值(就像C class ses一样)来减少耦合 . 受保护的成员变量总是一个坏主意,受保护的成员函数可用于例如受保护的成员函数 . 模板方法模式 .

  • 21

    受保护的成员只能由类的后代和同一模块中的代码访问 . 私有成员只能通过它们声明的类以及同一模块中的代码来访问 .

    当然朋友的功能把它扔出了窗外,但是哦 .

  • 4

    MFC偏爱受保护的原因是因为它是一个框架 . 您可能希望子类化MFC类,在这种情况下,需要一个受保护的接口来访问一般使用该类不可见的方法 .

  • 51

    这完全取决于您想要做什么,以及您希望派生类能够看到什么 .

    class A
    {
    private:
        int _privInt = 0;
        int privFunc(){return 0;}
        virtual int privVirtFunc(){return 0;}
    protected:
        int _protInt = 0;
        int protFunc(){return 0;}
    public:
        int _publInt = 0;
        int publFunc()
        {
             return privVirtFunc();
        }
    };
    
    class B : public A
    {
    private:
        virtual int privVirtFunc(){return 1;}
    public:
        void func()
        {
            _privInt = 1; // wont work
            _protInt = 1; // will work
            _publInt = 1; // will work
            privFunc(); // wont work
            privVirtFunc(); // wont work
            protFunc(); // will work
            publFunc(); // will return 1 since it's overridden in this class
        }
    }
    
  • 4

    private =只能由母舰(基层)进入(即只有我的父母可以进入我父母的卧室)

    protected =母舰(基层)和她的女儿(即只有我的父母可以进入我父母的卧室)才能进入

    public =母亲(基类),女儿和其他所有人都可以访问(也就是说,只有我的父母可以进入我的父母's bedroom, but it' s家庭聚会 - mi casa su casa)

  • 4

    私有成员只能在它已声明的同一个类中访问,其中可以在类中声明受保护成员,并在其中声明它所继承的类 .

  • 8

    private 是会员数据的首选 . 默认情况下,C类中的成员为 private .

    public 是成员函数的首选,但这是一个意见问题 . 至少有一些方法必须是可访问的 . 所有人都可以访问 public . 这是最灵活的选择,也是最不安全的选择 . 任何人都可以使用它们,任何人都可以滥用它们 .

    private 根本无法访问 . 没有人可以在课外使用它们,没有人可以滥用它们 . 甚至在派生类中也没有 .

    protected 是一种妥协,因为它可以在派生类中使用 . 当您从一个类派生时,您对基类有很好的理解,并且注意不要滥用这些成员 .

    MFC是Windows API的C包装器,它更喜欢 publicprotected . Visual Studio向导生成的类具有 protectedpublicprivate 成员的丑陋组合 . 但是MFC类本身有一些逻辑 .

    SetWindowText 等成员是 public 因为您经常需要访问这些成员 .

    OnLButtonDown 等成员处理窗口收到的通知 . 不应该访问它们,因此它们是 protected . 您仍然可以在派生类中访问它们以覆盖这些函数 .

    一些成员必须执行线程和消息循环,不应该访问它们或覆盖它们,因此它们被声明为 private

    在C结构中,默认情况下成员为 public . 结构通常仅用于数据,而不是方法,因此 public 声明被认为是安全的 .

  • 2

    通过使用以下之一,可以由从该基类派生的任何类的成员和朋友访问受保护的非静态基类成员:

    • 指向直接或间接派生类的指针

    • 对直接或间接派生类的引用

    • 直接或间接派生类的对象

  • 1

    由于在派生类中不需要公共成员函数来获取和更新受保护的成员,因此这可以提高代码的效率并减少我们需要编写的代码量 . 但是,派生类的程序员应该知道他在做什么 .

  • 1

    私有成员只能在定义它们的类中访问 .

    受保护的成员可以在定义它们的类中以及从该类继承的类中访问 .

    编辑:两个人也可以由他们 class 的朋友访问,对于受保护的成员,他们的派生类的朋友也可以访问 .

    编辑2:在问题的上下文中使用任何有意义的东西 . 您应该尽可能地将成员设为私有,以便减少耦合并保护基类的实现,但如果不可能,则使用受保护的成员 . 检查C++ FAQ以更好地了解该问题 . This question about protected variables也可能有所帮助 .

  • 0
    • Private :这是一个访问说明符 . 默认情况下,实例(成员)变量或c / java中类的方法是私有的 . 在继承期间,代码和数据总是被继承但是课外无法进入 . 我们可以将我们的数据成员声明为私有,这样任何人都无法直接更改我们的成员变量,我们可以提供公共getter和setter来更改我们的私有成员 . 这个概念总是应用于业务规则中 .

    • Protected :它也是一个访问说明符 . 在C中,受保护的成员可以在类和继承的类中访问,但不能在类外部访问 . 在Java中,受保护的成员可以在类中访问,也可以在继承的类中访问,也可以在同一个包中的所有类中访问 .

  • 5

    可以从派生类访问受保护的成员 . 私人不能 .

    class Base {
    
    private: 
      int MyPrivateInt;
    protected: 
      int MyProtectedInt;
    public:
      int MyPublicInt;
    }
    
    class Derived : Base
    {
    public:
      int foo1()  { return MyPrivateInt;} // Won't compile!
      int foo2()  { return MyProtectedInt;} // OK  
      int foo3()  { return MyPublicInt;} // OK
    };
    
    class Unrelated 
    {
    private:
      Base B;
    public:
      int foo1()  { return B.MyPrivateInt;} // Won't compile!
      int foo2()  { return B.MyProtectedInt;} // Won't compile
      int foo3()  { return B.MyPublicInt;} // OK
    };
    

    就“最佳实践”而言,这取决于 . 如果有人可能想要从现有的类中获取新类并且需要访问内部成员,那么即使是微弱的可能性,也要使它们成为受保护的,而不是私有的 . 如果他们是私人的,你的 class 可能很难轻易继承 .

  • 1

    标记为 protected 的属性和方法 - 与私有属性不同 - 在子类中仍然可见 .

    除非你不让他们 private .

  • 2

    private和protected访问修饰符只能在子(派生)类的基类范围之外访问基类的受保护成员 . 它也适用于继承 . 但是使用private修饰符,基类的成员只能在基类的范围或代码中访问,而其友元函数只能在''''

  • 317

    Public 所有人都可以访问A类成员 .

    Protected 类A的成员在A代码之外是不可访问的,但可以从A派生的任何类的代码访问 .

    Private A类成员不能在A代码之外访问,也不能从A派生的任何类的代码访问 .

    因此,最后,在受保护或私人之间进行选择是回答以下问题: How much trust are you willing to put into the programmer of the derived class?

    By default ,假设派生类不可信,并且 make your members private . 如果你有充分的理由让母语类'internals免费访问它的派生类,那么你可以使它们受到保护 .

  • -2

    私有成员只能从类中访问,受保护的成员可以在类和派生类中访问 . 它是OO语言中继承的一个特性 .

    您可以在C中拥有私有,受保护和公共继承,这将确定哪些派生类可以在继承层次结构中访问 . 例如,C#只有公共继承 .

相关问题