C+的私有成员和受保护成员之间有什么区别+;上课? < > >代码>私有< /COD>和保护< /COD> C++类中的成员?

C+的私有成员和受保护成员之间有什么区别+;上课? < > >代码>私有< /COD>和保护< /COD> C++类中的成员?,c++,class,oop,private,protected,C++,Class,Oop,Private,Protected,我从最佳实践惯例中了解到,不在类外调用的变量和函数应该是私有的,但看看我的MFC项目,MFC似乎更喜欢受保护的 区别是什么?我应该使用哪个?私有成员只能在定义它们的类中访问 受保护的成员可以在定义它们的类和从该类继承的类中访问 编辑:这两个类都可以由其类的朋友访问,如果是受保护的成员,则由其派生类的朋友访问 编辑2:在你的问题背景下使用任何有意义的东西。您应该尽可能使成员私有,以减少耦合并保护基类的实现,但如果不可能,则使用受保护的成员。检查以更好地了解该问题。也可能有帮助。标记为受保护的属性和

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


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

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

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

编辑:这两个类都可以由其类的朋友访问,如果是受保护的成员,则由其派生类的朋友访问


编辑2:在你的问题背景下使用任何有意义的东西。您应该尽可能使成员私有,以减少耦合并保护基类的实现,但如果不可能,则使用受保护的成员。检查以更好地了解该问题。也可能有帮助。

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


除非您不想在可能的子类中使用或提供重写方法的可能性,否则我将使受保护的成员只能由类的后代和同一模块中的代码访问。私有成员只能由声明它们的类和同一模块中的代码访问


当然,友元函数会将其抛出窗口,但是很好。

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


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

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

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

就“最佳实践”而言,这要视情况而定。如果有人想从您现有的类派生一个新类并需要访问内部成员的可能性很小,请将其设置为受保护的,而不是私有的。如果它们是私有的,您的类可能很难从中轻松继承。

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

Public所有人都可以访问类a的成员

受保护的类a的成员不能在a的代码之外访问,但可以从从a派生的任何类的代码中访问

Private类a的成员在a的代码之外或从a派生的任何类的代码中都无法访问

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


默认情况下,假定派生类不受信任,并将您的成员设置为私有的。如果您有很好的理由允许母类的内部成员自由访问其派生类,那么您可以对它们进行保护。

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

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(); // will work, simply calls the derived version.
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}

当然,看看这个问题。建议使用私有作为默认值(就像C++ +Cux>类< /COD> SES DO)来减少耦合。受保护的成员变量通常是个坏主意,受保护的成员函数可用于模板方法模式等

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

私有成员只能在同一个类中访问,在该类中,它声明了作为受保护成员的位置,可以在该类中与其继承的类一起访问。

受保护的非静态基类成员可以通过通过使用以下方法之一从该基类派生的任何类的成员和好友:

  • 指向直接或间接派生类的指针
  • 对直接或间接派生类的引用
  • 直接或间接派生类的对象
      • Private:它是一个访问说明符。默认情况下,c++/java中的实例(成员)变量或类的方法是私有的。在继承过程中,代码和数据总是被继承的,但在类之外是不可访问的。我们可以将数据成员声明为私有成员,这样就没有人可以直接更改我们的成员变量,我们可以提供公共getter和setter来更改我们的私有成员。这个概念总是应用在业务规则中

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


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