代码之家  ›  专栏  ›  技术社区  ›  Konrad

私有和受保护成员:C++

  •  236
  • Konrad  · 技术社区  · 16 年前

    有人能告诉我 private protected 班上的成员?

    我从最佳实践惯例中了解到,不在类外调用的变量和函数应该被生成 私有的 -但是看着我的 MFC 项目, MFC 似乎赞成 受保护的 .

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

    16 回复  |  直到 6 年前
        1
  •  324
  •   jdhao    8 年前

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

    在定义受保护成员的类和从该类继承的类中,可以访问受保护成员。

    编辑:这两个类的朋友也可以访问,如果是受保护的成员,也可以通过其派生类的朋友访问。

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

        2
  •  119
  •   paercebal    16 年前

    公众 所有人和所有人都可以访问A级的成员。

    受保护的 类A的成员在代码之外是不可访问的,但可以从派生自A的任何类的代码访问。

    私人的 类A的成员在代码之外或从派生自A的任何类的代码中都不可访问。

    因此,最终,在受保护或私有之间进行选择可以回答以下问题: 您愿意对派生类的程序员给予多少信任?

    默认情况下 ,假设派生类不受信任,并且 将您的成员设为私人 . 如果您有一个非常好的理由让母类的内部构件自由访问其派生类,那么您可以使它们受到保护。

        3
  •  55
  •   Flinsch    6 年前

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

    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
    };
    

    就“最佳实践”而言,这取决于。如果甚至有一种微弱的可能性,某人可能希望从您现有的类派生一个新的类,并且需要访问内部成员,那么就让它们受到保护,而不是私有的。如果它们是私有的,您的类可能很难轻易继承。

        4
  •  21
  •   Toon Krijthe    16 年前

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

        5
  •  8
  •   Mats Fredriksson    16 年前

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

    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
        }
    }
    
        6
  •  5
  •   fhe    16 年前

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

    除非您不想使用或提供重写可能子类中的方法的可能性,否则我将使它们 private .

        7
  •  4
  •   Ignacio Vazquez-Abrams    16 年前

    受保护的成员只能由类的后代和同一模块中的代码访问。私有成员只能由声明它们的类和同一模块中的代码访问。

    当然,朋友的功能会把这个扔到窗外,但哦,好吧。

        8
  •  4
  •   PhilGriffin    16 年前

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

    您可以在C++中拥有私有的、受保护的和公共的继承,这将决定继承类中的派生类可以访问什么。例如,只有公共继承权。

        9
  •  4
  •   Community CDub    8 年前

    当然可以看看 Protected Member Variables 问题。建议使用私有作为默认值(就像C++一样)。 class SES做)以减少耦合。受保护的成员变量通常是一个坏主意,受保护的成员函数可以用于模板方法模式。

        10
  •  3
  •   Johan K. Rhodes    8 年前

    私有的 =仅由母舰(基类)访问 (只有我父母才能进我父母的卧室)

    受保护的 =母舰(基类)和她的女儿可以访问 (即只有我的父母才能进入我父母的卧室,但允许儿子/女儿进入父母的卧室)

    公众的 =母舰(基类)、女儿和其他所有人都可以访问 (只有我的父母才能进我父母的卧室,但这是一个家庭聚会-米卡萨苏卡萨)

        11
  •  2
  •   Yoon5oo JBE    7 年前

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

        12
  •  1
  •   Gayki    11 年前

    私有成员只能在声明为“受保护成员”的同一类中访问,在声明为“受保护成员”的类中可以访问该成员及其继承的类。

        13
  •  1
  •   Yoon5oo JBE    7 年前
    • 私人的 :它是访问说明符。默认情况下,C++/Java中的实例(成员)变量或类的方法是私有的。在继承过程中,代码和数据总是继承的,但在类外部是不可访问的。我们可以将数据成员声明为私有的,这样就没有人可以直接更改我们的成员变量,并且我们可以提供公共的getter和setter来更改我们的私有成员。这一概念一直在商业规则中应用。

    • 受保护的 :它也是一个访问说明符。在C++中,受保护成员在类和继承类中都是可访问的,但不在类之外。在Java中,受保护的成员在类内、继承的类以及同一包内的所有类都是可访问的。

        14
  •  1
  •   Barmak Shemirani    7 年前

    private 是成员数据的首选项。C++类中的成员是 私有的 默认情况下。

    public 成员职能优先考虑,尽管这是一个意见问题。至少某些方法必须是可访问的。 公众的 所有人都可以访问。这是最灵活的选择,也是最不安全的选择。任何人都可以使用它们,任何人都可以滥用它们。

    私有的 根本无法访问。没有人可以在课堂外使用它们,也没有人可以滥用它们。甚至在派生类中也是如此。

    protected 是一个折衷方案,因为它可以在派生类中使用。当您从类派生时,您对基类有很好的理解,并且您小心地不要滥用这些成员。

    MFC是一个用于Windows API的C++包装器,它更喜欢 公众的 受保护的 . 由Visual Studio向导生成的类混合了 受保护的 , 公众的 私有的 成员。但是,MFC类本身也有一些逻辑。

    成员如 SetWindowText 公众的 因为你经常需要访问这些成员。

    成员如 OnLButtonDown ,处理窗口接收到的通知。它们不应该被访问,因此它们是 受保护的 . 您仍然可以在派生类中访问它们来重写这些函数。

    有些成员必须执行线程和消息循环,不应访问或重写它们,因此它们被声明为 私有的

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

        15
  •  0
  •   user32434999    7 年前

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

    • 指向直接或间接派生类的指针
    • 对直接或间接派生类的引用
    • 直接或间接派生类的对象
        16
  •  -2
  •   Emmanuel Muniko    8 年前

    private和protected访问修饰符是一个且相同的修饰符,只有在子(派生)类的基类范围之外才能访问基类的受保护成员。 它也同样适用于继承。 但是,使用私有修饰符,只能在基类的作用域或代码中访问基类成员,并且只能在其友元函数“”中访问该成员。

    推荐文章