私人和受保护成员 我很难理解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的断言是,如果你需要某种东西受到保护,那么它就应该受到保护相同的虚拟方法默认应该是私有的。我想我们基本上同意;我们只是对“稀有”一词有不同的含义。使用受保护的成员有什么不好的地方?(我都使用它们)