c++类中的私有成员和受保护成员有什么区别?

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

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


当前回答

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

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

其他回答

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

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

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

编辑:两者都可以被其类的友元访问,如果是受保护成员,则可以被其派生类的友元访问。

编辑2:使用任何在你的问题上下文中有意义的东西。您应该尽可能地将成员设为private,以减少耦合并保护基类的实现,但如果不可能,则使用受保护的成员。查看c++常见问题以更好地理解这个问题。这个关于受保护变量的问题可能也有帮助。

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

Private: It is an access specifier. By default the instance (member) variables or the methods of a class in c++/java are private. During inheritance, the code and the data are always inherited but is not accessible outside the class. We can declare our data members as private so that no one can make direct changes to our member variables and we can provide public getters and setters in order to change our private members. And this concept is always applied in the business rule. Protected: It is also an access specifier. In C++, the protected members are accessible within the class and to the inherited class but not outside the class. In Java, the protected members are accessible within the class, to the inherited class as well as to all the classes within the same package.

a类的公共成员对所有人都是开放的。

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

类a的私有成员不能在a的代码之外或从a派生的任何类的代码中访问。

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

默认情况下,假定派生类不可信,并将成员设为private。如果你有一个很好的理由让它的派生类可以自由访问母类的内部内容,那么你可以让它们受到保护。