c++类中的私有成员和受保护成员有什么区别?
我从最佳实践惯例中了解到,没有在类外部调用的变量和函数应该是私有的,但看看我的MFC项目,MFC似乎更倾向于受保护。
有什么区别,我应该用哪个?
c++类中的私有成员和受保护成员有什么区别?
我从最佳实践惯例中了解到,没有在类外部调用的变量和函数应该是私有的,但看看我的MFC项目,MFC似乎更倾向于受保护。
有什么区别,我应该用哪个?
当前回答
与私有属性和方法不同,标记为受保护的属性和方法在子类中仍然可见。
除非您不想在可能的子类中使用或提供重写该方法的可能性,否则我会将它们设为private。
其他回答
这完全取决于您想要做什么,以及您希望派生类能够看到什么。
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
}
}
私有成员只能在定义它们的类中访问。
可在定义受保护成员的类中以及从该类继承的类中访问受保护成员。
编辑:两者都可以被其类的友元访问,如果是受保护成员,则可以被其派生类的友元访问。
编辑2:使用任何在你的问题上下文中有意义的东西。您应该尽可能地将成员设为private,以减少耦合并保护基类的实现,但如果不可能,则使用受保护的成员。查看c++常见问题以更好地理解这个问题。这个关于受保护变量的问题可能也有帮助。
MFC偏爱protected的原因是因为它是一个框架。您可能想要子类化MFC类,在这种情况下,需要一个受保护的接口来访问类的一般用途不可见的方法。
与私有属性和方法不同,标记为受保护的属性和方法在子类中仍然可见。
除非您不想在可能的子类中使用或提供重写该方法的可能性,否则我会将它们设为private。
c++类中的私有成员和受保护成员有什么区别?
其他的回答说:
公共-所有人都可以访问。 Protected -派生类(和友类)可以访问。 私人限制。
有什么区别,我应该用哪个?
c++的核心准则给出了数据应该始终是私有的建议。我认为这是一个很好的建议,因为当你的派生类可以访问受保护的数据时,它会导致“数据面条”。保护函数更有意义,但这取决于用例。
对于函数,你有一个选择。对于数据,应该将其设置为私有,并在需要时提供受保护的访问函数。这样可以更好地控制类数据。