私人和受保护成员 我很难理解C++类中私有成员和受保护成员之间的区别。简单来说,区别是什么?

私人和受保护成员 我很难理解C++类中私有成员和受保护成员之间的区别。简单来说,区别是什么?,c++,class,private,member,protected,C++,Class,Private,Member,Protected,受保护的成员可以由派生类(和朋友)访问 私有成员只能由声明类(或朋友)访问 简单的例子: class Base { protected: int prot; private: int priv; public: int Prot() const { return prot; } int Priv() const { return priv; } }; class Derived { public: void ShowProt() { cout <

受保护的成员可以由派生类(和朋友)访问

私有成员只能由声明类(或朋友)访问

简单的例子:

class Base
{
protected:
    int prot;

private:
    int priv;

public:
    int Prot() const { return prot; }
    int Priv() const { return priv; }
};

class Derived
{
public:
    void ShowProt() { cout << prot; }  // OK - prot is accessible because it is protected
    void ShowPriv() { cout << priv; }  // Compile Error - cannot access priv, which is private
    void ShowPriv2() { cout << Priv(); } // OK, because Priv() is public
};
类基
{
受保护的:
int-prot;
私人:
int priv;
公众:
int Prot()常量{return Prot;}
int Priv()常量{return Priv;}
};
类派生
{
公众:

void ShowProt(){cout受保护的成员可以由派生类(和朋友)访问

私有成员只能由声明类(或朋友)访问

简单的例子:

class Base
{
protected:
    int prot;

private:
    int priv;

public:
    int Prot() const { return prot; }
    int Priv() const { return priv; }
};

class Derived
{
public:
    void ShowProt() { cout << prot; }  // OK - prot is accessible because it is protected
    void ShowPriv() { cout << priv; }  // Compile Error - cannot access priv, which is private
    void ShowPriv2() { cout << Priv(); } // OK, because Priv() is public
};
类基
{
受保护的:
int-prot;
私人:
int priv;
公众:
int Prot()常量{return Prot;}
int Priv()常量{return Priv;}
};
类派生
{
公众:

void ShowProt(){cout
受保护的
成员可由派生类访问。
私有
成员不可访问

通常(大多数情况下)成员应该是
私有的
公共的
。在设计良好的系统中,需要
受保护的
成员(编辑)是非常罕见的

编辑: 也许我应该详细说明为什么
受保护的
成员可能是一种代码气味

如果派生类可以访问其他类无法访问的数据成员,这可能表明基类和派生类的耦合过于紧密。派生类可以访问基类的状态,因此基类的状态可能会损坏。如果不是这样,则通常也没有理由必须将数据成员
公开

其他人对此进行了更详细的讨论

以下是斯特劳斯特鲁普在他的文章中所说的:

被宣布受保护的成员远远不够 比议员更容易被人滥用 被宣布为私人的,特别是, 声明数据成员受保护 通常是设计错误。放置 数据库中的大量数据 所有派生类的公共类 若要使用,请将该数据保留为打开状态 腐败。更糟糕的是,受保护的数据, 与公共数据一样,数据也不容易保存 重组是因为没有什么好处 找到每一个用途的方法。因此, 受保护的数据成为一种软件 维修问题


另请参见。

受保护的
成员可由派生类访问。
私有的
成员不可访问

通常(大多数情况下)成员应该是
私有的
公共的
。在设计良好的系统中,需要
受保护的
成员(编辑)是非常罕见的

编辑: 也许我应该详细说明为什么
受保护的
成员可能是一种代码气味

如果派生类可以访问其他类无法访问的数据成员,这可能表明基类和派生类的耦合过于紧密。派生类可以访问基类的状态,因此基类的状态可能会损坏。如果不是这样,则通常也没有理由必须将数据成员
公开

其他人对此进行了更详细的讨论

以下是斯特劳斯特鲁普在他的文章中所说的:

被宣布受保护的成员远远不够 比议员更容易被人滥用 被宣布为私人的,特别是, 声明数据成员受保护 通常是设计错误。放置 数据库中的大量数据 所有派生类的公共类 若要使用,请将该数据保留为打开状态 腐败。更糟糕的是,受保护的数据, 与公共数据一样,数据也不容易保存 重组是因为没有什么好处 找到每一个用途的方法。因此, 受保护的数据成为一种软件 维修问题

另请参见。

中的:

  • 在类的私有部分声明的成员(数据成员或成员函数)只能由该类的成员函数和朋友访问
  • 在类的受保护节中声明的成员(数据成员或成员函数)只能由该类的成员函数和友元以及派生类的成员函数和友元访问
  • 任何人都可以访问在类的公共部分声明的成员(数据成员或成员函数)
来自:

  • 在类的私有部分声明的成员(数据成员或成员函数)只能由该类的成员函数和朋友访问
  • 在类的受保护节中声明的成员(数据成员或成员函数)只能由该类的成员函数和友元以及派生类的成员函数和友元访问
  • 任何人都可以访问在类的公共部分声明的成员(数据成员或成员函数)

使用受保护的
成员有什么地方设计得不好?(我一直在使用它们——我做错了什么?@Kristopher:请看我的编辑。我已经详细阐述并交叉引用了,试图回答你的问题。在中,Sutter说“如果派生类需要调用虚拟函数的基本实现,请使虚拟函数受到保护”。因此,这是你方的一位专家和我方的一位专家。:)但说真的,我认为“罕见和不寻常”是言过其实。我接受“不寻常”",但有时接受基类和派生类之间的某种耦合比其他方法更简单。我不认为我所说的任何事情都与Sutter的断言不一致,Sutter的断言是,如果你需要某种东西受到
保护,那么它就应该受到
保护相同的虚拟方法默认应该是私有的。我想我们基本上同意;我们只是对“稀有”一词有不同的含义。使用受保护的成员有什么不好的地方?(我都使用它们)