私人和受保护成员:C++

Kon*_*rad 265 c++ mfc class

有人可以告诉我类privateprotected成员之间的区别吗?

我从最佳实践约定中了解到应该在类外部调用的变量和函数private- 但是看看我的MFC项目,MFC似乎更喜欢protected.

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

Fir*_*aad 359

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

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

编辑:两个人也可以由他们班级的朋友访问,对于受保护的成员,他们的派生类的朋友也可以访问.

编辑2:在问题的上下文中使用任何有意义的东西.您应该尝试在可以减少耦合并保护基类的实现时使成员变为私有,但如果不可能,则使用受保护的成员.检查C++ FAQ以更好地理解该问题.关于受保护变量的这个问题也可能有所帮

  • C++ FAQ Lite的链接已移至https://isocpp.org/wiki/faq/basics-of-inheritance (12认同)

pae*_*bal 130

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

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

A类的私有成员不能在A代码之外访问,也不能从A派生的任何类的代码访问.

因此,最后,在protected或private之间进行选择会回答以下问题:您愿意对派生类的程序员有多少信任?

默认情况下,假设派生类不受信任,并使您的成员成为私有.如果您有充分的理由将母类的内部组件自由访问其派生类,那么您可以使它们受到保护.


Rod*_*ddy 60

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

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
};
Run Code Online (Sandbox Code Playgroud)

就"最佳实践"而言,取决于.如果有人甚至可能想要从现有的类中获取新类并且需要访问内部成员,那么请将它们设为Protected,而不是Private.如果他们是私人的,你的班级可能很难轻易继承.

  • 我不同意:如果有一个微弱的可能性,_no_子类将需要它,请将其设为私有.除非_intend_将您的类子类化,否则请使用模板方法模式. (3认同)

Too*_*the 22

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


Mat*_*son 8

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)


fhe*_*fhe 5

标记为的属性和方法protected- 与私有属性不同 - 在子类中仍然可见.

除非你不想使用或提供在可能的子类中覆盖方法的可能性,否则我会制作它们private.

  • 派生类可以覆盖其基础的私有虚函数 (2认同)

xto*_*ofl 5

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