private 成员和 protected 的区别和用法
2006-12-18 18:18
316 查看
也不知道应不应该算原创,这些内容几乎每本讲面向对象语言的书里面都有 ,只不过是长时间不用,忘记了,自己写一段代码验证一下,姑且就算原创吧~~
也没什么好多说的,就一段代码:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 目的:试验基类中的 private 成员是否能被派生类访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 结果:基类中的 private 成员不能被派生类访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 办法:若想让基类中的成员能够被派生类访问,而又不能让外界访问,用 protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
class BaseClass ...{ // 基类
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
private:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int m_iPrivate; // private 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
protected:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int m_iProtected; // protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
public:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
int GetPrivateMember() ...{ return m_iPrivate; }
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
int GetProtectedMember() ...{ return m_iProtected; }
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
BaseClass() ...{ // 构造函数, 初始化成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
m_iPrivate = 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
m_iProtected = 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
};
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
class DeriveClass : public BaseClass ...{ // 派生类, 派生自 BaseClass
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
public:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
void fun() ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// m_iPrivate = 1; // 错误, 派生类不能访问基类 private 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
m_iProtected = 1; // 正确, 派生类可以访问基类 protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
};
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
int main() ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
BaseClass base;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// base.m_iPrivate; // 错误, private 成员外部不能访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// base.m_iProtected; // 错误, protected 成员外部不能访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
base.GetPrivateMember(); // 正确, 通过 public 成员访问 private 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
base.GetProtectedMember(); // 正确, 通过 public 成员访问 protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
也没什么好多说的,就一段代码:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 目的:试验基类中的 private 成员是否能被派生类访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 结果:基类中的 private 成员不能被派生类访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
// 办法:若想让基类中的成员能够被派生类访问,而又不能让外界访问,用 protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
class BaseClass ...{ // 基类
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
private:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int m_iPrivate; // private 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
protected:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int m_iProtected; // protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
public:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
int GetPrivateMember() ...{ return m_iPrivate; }
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
int GetProtectedMember() ...{ return m_iProtected; }
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
BaseClass() ...{ // 构造函数, 初始化成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
m_iPrivate = 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
m_iProtected = 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
};
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
class DeriveClass : public BaseClass ...{ // 派生类, 派生自 BaseClass
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
public:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
void fun() ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// m_iPrivate = 1; // 错误, 派生类不能访问基类 private 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
m_iProtected = 1; // 正确, 派生类可以访问基类 protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
};
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
int main() ...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
BaseClass base;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// base.m_iPrivate; // 错误, private 成员外部不能访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
// base.m_iProtected; // 错误, protected 成员外部不能访问
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
base.GetPrivateMember(); // 正确, 通过 public 成员访问 private 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
base.GetProtectedMember(); // 正确, 通过 public 成员访问 protected 成员
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
相关文章推荐
- asp.net中protected/private/public的用法与区别
- C#中类及类型成员修饰符:public,private,protected,internal的区别
- C/C++基础之:类成员变量的修饰public/private/protected的区别
- C++ 定义类时public、private、protected成员的区别
- public,private,protected的区别是什么
- 反射获取对象成员的字段值,getFields()和getDeclaredFields()用法区别
- C#中internal与protected,private等修饰的联系与区别
- 第2章 Java编程基础——FAQ2.03 用public. protected和private修饰方法有什么区别?
- java中的public,private,protected修饰符,以及不写(默认)时的区别
- 深入理解C++中public、protected及private用法
- Java之public、protected、private区别
- Java常考面试题2--访问修饰符public,private,protected,以及不写(默认)时的区别?
- 深入理解C++中public、protected及private用法
- Java中的private、protected、public和default的区别
- java类成员访问权限总结(private,default,protected,public)
- Java中的private、protected、public和default的区别
- Java中public,private,protected的区别,包的访问权限
- public/private/protected的具体区别
- Java【public、private、protected区别】-访问权限
- public private protected default 区别