c++ - 保护成员 - 私有继承作用




私有和受保护成员:C++ (10)

有人能就班级中私人和受保护成员之间的差异给我启发吗? 我从最佳实践规范中了解到,那些不在课堂外调用的变量和函数应该是私有的 - 但是看着我的MFC项目,MFC似乎赞成保护。

有什么区别和我应该使用什么?


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


私人 =只能由母亲(基础班)访问(即只有我的父母可以进入我父母的卧室)

受保护 =可以通过母亲(基础班)和她的女儿进入(即只有我的父母可以进入我父母的卧室,但允许儿子/女儿走进父母的卧室)

公众 =母亲(基础班),女儿和其他人都可以访问(即只有我的父母可以进入我父母的卧室,但这是一场家庭聚会 - mi casa su casa)


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

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

就“最佳实践”而言,这取决于。 如果有人可能想要从现有成员中派生出一个新班级,并且需要访问内部成员,那么这个可能性微乎其微,并且让他们受到保护,而不是私人。 如果他们是私人的,你的班级可能很难轻易继承。


受保护的非静态基类成员可以通过使用以下其中一种方法从该基类派生的任何类的成员和朋友访问:

  • 指向直接或间接派生类的指针
  • 对直接或间接派生类的引用
  • 直接或间接派生类的对象

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


所有人和所有人都可以访问A类的公共成员。

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

A类的私人成员不能在A的代码之外或者从A派生的任何类的代码之外访问。

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

默认情况下 ,假设派生类不被信任, 并使您的成员保持私有状态 。 如果你有一个很好的理由让母类的内部机构免费访问它的派生类,那么你可以保护它们。


私人成员只能在定义他们的班级中访问。

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

编辑:两者都可以由他们的班级的朋友访问,并且在受保护的成员的情况下,由他们的派生类的朋友访问。

编辑2:在问题的背景下使用任何有意义的东西。 你应该尽可能地让成员变成私有的,以减少耦合并保护基类的实现,但如果这是不可能的,那么使用受保护的成员。 检查C ++ FAQ以更好地理解问题。 这个关于保护变量的问题也可能有帮助。


私人成员只能在类中访问,受保护的成员可以在类和派生类中访问。 这是面向对象语言的继承功能。

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


私有成员只能在其声明的同一类中访问,因为受保护的成员可以在声明的类中进行访问,并且可以在继承它的类中进行声明。


私有:它是一个访问说明符。 默认情况下,实例(成员)变量或c ++ / java中的类的方法是私有的。 在继承过程中,代码和数据总是被继承,但不能在类之外访问。 我们可以将我们的数据成员声明为私有的,以便没有人可以直接更改我们的成员变量,并且我们可以提供公共getter和setter来更改我们的私有成员。 这个概念总是适用于商业规则。

受保护:它也是一个访问说明符。 在c ++中,受保护的成员可以在类和继承类中访问,但不能在类之外访问。 在java中,受保护的成员可以在类中访问,也可以在继承的类中访问,也可以在同一个包中访问所有的类。





mfc