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。如果它们是私有的,那么您的类就很难轻易继承。

其他回答

当然,看看受保护的成员变量问题。建议使用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
    }
}

a类的公共成员对所有人都是开放的。

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

类a的私有成员不能在a的代码之外或从a派生的任何类的代码中访问。

因此,最终,在受保护还是私有之间做出选择是为了回答以下问题:您愿意对派生类的程序员给予多少信任?

默认情况下,假定派生类不可信,并将成员设为private。如果你有一个很好的理由让它的派生类可以自由访问母类的内部内容,那么你可以让它们受到保护。

私有成员只能从类内部访问,受保护成员可以在类和派生类中访问。这是面向对象语言中继承的一个特性。

在c++中可以有私有、受保护和公共继承,这将决定哪些派生类可以在继承层次结构中访问。例如,c#只有公共继承。

Private:可由类成员函数和好友函数或好友类访问。 对于c++类,这是默认的访问说明符。

Protected:可由类成员函数、友元函数或友元类及派生类访问。

您可以根据需要将类成员变量或函数(甚至是typedefs或内部类)保留为私有或受保护。 大多数情况下,保持类成员为私有,并添加get/set函数进行封装。这有助于代码的维护。 一般来说,当你想要保持公共函数模块化或消除重复代码而不是将整个代码写入单个函数时,就会使用私有函数。这有助于代码的维护。

更多细节请参考这个链接。