Answers:
私有成员只能在定义它们的类中访问。
受保护的成员可以在定义它们的类以及从该类继承的类中访问。
编辑:他们的班级的朋友也可以访问它们,对于受保护的成员,他们派生的班级的朋友也可以访问它们。
编辑2:根据您的问题使用任何有意义的方法。您应该尽可能地使成员成为私有成员,以减少耦合并保护基类的实现,但是,如果那不可能,则使用受保护的成员。查看C ++常见问题解答,以更好地了解该问题。有关受保护变量的问题也可能会有所帮助。
每个人都可以访问A类的公共成员。
类A的受保护成员不能从A的代码之外访问,但是可以从从A派生的任何类的代码访问。
在A的代码之外或从A派生的任何类的代码之外,无法访问A类的私有成员。
因此,最后,在受保护的或私有的之间进行选择将回答以下问题:您愿意对派生类的程序员信任多少?
默认情况下,假设派生类不受信任,并将您的成员设为private。如果您有充分的理由让母类的内部对象可以自由访问其派生类,则可以使它们受到保护。
the protected data of the base class is part of the data of the derived class.
确实。那么,让派生类的编写者在其类中声明数据而不是我的数据不是更好吗?... :-) ... The writer of the derived class is expected to handle this data properly or it is a bug.
在NVI模式中,目标是使所有内容私有,包括方法,以限制派生类编写者可能对层次结构造成的损害。受保护的方法已经是一个潜在的问题。我不认为通过使用保护状态来加剧这种情况是正确的方法。
可以从派生类访问受保护的成员。私人的不能。
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 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
}
}
受保护的成员只能由该类的后代以及同一模块中的代码访问。私有成员只能通过在其内声明的类以及同一模块中的代码进行访问。
当然,朋友函数会将其排除在外,但是,哦,好。
私人 =只能由母舰(基类)访问(即只有我的父母可以进入父母的卧室)
受保护 =可以由母权(基层)和她的女儿访问(即只有我父母可以进入父母的卧室,但允许儿子/女儿进入父母的卧室)
public =母权(基类),女儿和其他所有人均可访问(即,只有我父母可以进入父母的卧室,但这是家庭聚会-mi casa su casa)
private
是首选的成员数据。private
默认情况下,C ++类中的成员是。
public
尽管这是一个意见问题,但成员函数还是首选。至少某些方法必须可访问。public
所有人都可以使用。这是最灵活,最不安全的选择。任何人都可以使用它们,任何人都可以滥用它们。
private
根本无法访问。没有人可以在课堂外使用它们,也没有人可以滥用它们。甚至在派生类中也没有。
protected
这是一种折衷,因为它可以在派生类中使用。从类派生时,您对基类有很好的了解,并且请小心不要滥用这些成员。
MFC是Windows API的C ++包装器,它更喜欢public
和protected
。由Visual Studio生成的类向导有一个丑陋的组合protected
,public
和private
成员。但是MFC类本身有一些逻辑。
会员如SetWindowText
在public
,因为你经常需要访问这些成员。
成员,如OnLButtonDown
,处理窗口收到的通知。不应访问它们,因此可以访问它们protected
。您仍然可以在派生类中访问它们以覆盖这些功能。
一些成员必须执行线程和消息循环,不应访问或覆盖它们,因此将它们声明为 private
在C ++结构中,成员public
默认为。结构通常仅用于数据,而不用于方法,因此public
声明被认为是安全的。
private
默认情况下在Visual Studio中。这是private
在默认情况下GCC为好,它永远不会public
被默认。除非我又错了。我找不到您所指的标准。
私有:这是一个访问说明符。默认情况下,实例(成员)变量或c ++ / java中类的方法是私有的。在继承期间,代码和数据始终被继承,但在类外部无法访问。我们可以将我们的数据成员声明为私有成员,这样就没有人可以直接更改我们的成员变量,并且可以提供公共获取者和设置者来更改我们的私有成员。并且这个概念总是在业务规则中应用。
受保护的:它也是访问说明符。在C ++中,受保护的成员可以在类内部以及继承的类中访问,但不能在类外部访问。在Java中,受保护的成员在类内,继承的类以及同一包内的所有类均可访问。
私有:可通过班级成员功能和朋友功能或朋友班级访问。对于C ++类,这是默认的访问说明符。
受保护:可由类成员函数,朋友函数或朋友类及派生类访问。
请参阅此链接以获取更多详细信息。
私有和受保护的访问修饰符是相同的,只是在孩子(派生)类的基类范围之外可以访问基类的受保护成员。它也适用于继承。但是使用private修饰符时,只能在基类及其朋友功能的范围或代码中访问基类的成员''