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

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

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


当前回答

可以从派生类访问受保护的成员。私立学校则不行。

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

至于“最佳实践”,则视情况而定。如果有人想要从您现有的类中派生一个新类,并且需要访问内部成员,那么将它们设置为Protected,而不是Private。如果它们是私有的,那么您的类就很难轻易继承。

其他回答

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

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

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

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

私有访问修饰符和受保护访问修饰符是相同的,只是基类的受保护成员可以在子(派生)类的基类范围之外被访问。 它也同样适用于继承。 但是使用私有修饰符,基类的成员只能在基类的作用域或代码中访问,它的友函数只能是''''

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

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

Private =只能由母类(基类)访问 (只有我父母才能进我父母的卧室)

Protected =母类(基类)和她的子类可以访问 (只有父母可以进父母的卧室,但允许儿子/女儿进父母的卧室)

Public =母类(基类)、子类和其他所有人都可以访问 (只有我父母才能进我父母的卧室,但那是家庭聚会——我的家是我的家)

受保护的非静态基类成员可以被派生自该基类的任何类的成员和友元访问,方法是使用以下方法之一:

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