c++ public protected private 继承
2024-09-04 17:08:55
1:访问控制
1.1 public 这类型成员可以被类本身函数访问,也可以被外部创建的类对象调用。子类对象与子类内部可以访问
1.2 protected类型成员,只能被类本身函数访问。外部创建的类对象没有访问权限。子类对象没有访问权限,子类内部可以访问
1.3 private类型成员,只能被类本身函数访问,外部创建的类对象没有访问权限。子类对象和子类内部都没有访问权限
class TestObject{
public:
void Function();
void TestPublic();
protected:
void TestProtected();
private:
void TestPrivate();
}; void TestObject::Function(){
TestPublic();
TestProtected();
TestPrivate();
} int main(){
TestObject obj;
obj.TestPublic();//yes
obj.TestProtected();//error
obj.TestPrivate();//error
}
2:继承关系的访问控制
2.1 public继承。public继承使子类顺延父类的访问控制属性,即成员保持父类的控制属性,这样在子类中的成员访问控制同父类的一样
class Base
{
public:
Base(void);
~Base(void);
void TestPublic();
protected:
void TestProtected();
private:
void TestPrivate();
}; void Base::TestPublic(){
cout<<"TestPublic"<<endl;
} void Base::TestProtected(){
cout<<"TestProtected"<<endl;
} void Base::TestPrivate(){
cout<<"TestPrivate"<<endl;
} class Child :
public Base
{
public:
Child ();
}; Child ::Child (){
child.TestPublic();//yes
TestProtected();//yes
TestPrivate();//error
} int _tmain(int argc, _TCHAR* argv[])
{
Child child;
child.TestPublic();//yes
//child.TestProtected();//error
//child.TestPrivate();//error
return ;
}
2.2 protected继承,将父类public和protected属性的成员属性顺延到子类来后变成protected属性。protected属性是可以提供给子类在内部访问的。
如上代码,如果改为protected继承。则内部访问保持和public继承的不变,而在外部,由于父类public属性被更改为protected的属性,则在外部创建的子类对象没有了访问权限。
class Child :protectedBase{
} Child ::Child (){
child.TestPublic();//yes
TestProtected();//yes
TestPrivate();//error
} int _tmain(int argc, _TCHAR* argv[])
{
Child child;
//child.TestPublic();//error
//child.TestProtected();//error
//child.TestPrivate();//error
return ;
}
2.3 private继承。这种继承方式中断了后续子类对当前类的父类的所有访问权限,在该种继承方式下,会将父类public和protected属性顺延成private属性。这样,几时后面子类再次继承,都没有了对当前父类的成员的访问权限。
class Child :privateBase{
} Child ::Child (){
child.TestPublic();//yes
TestProtected();//yes
TestPrivate();//error
} class Mini :public Child{
public:
Mini();
} Mini::Mini(){
TestPublic();//error
TestProtected();//error
TestPrivate();//error } int _tmain(int argc, _TCHAR* argv[])
{
Mini mini;
//mini.TestPublic();//error
//mini.TestProtected();//error
//mini.TestPrivate();//error
return ;
}
最新文章
- OpenFlow消息
- 【Python数据分析】Python3操作Excel-以豆瓣图书Top250为例
- RTC时钟
- 什么时候用@Resource,什么时候用@service
- LAMP环境搭建 (原创帖,转载请注明出处)
- C++Primer 一
- 惊鸿一瞥(Glimpse)&mdash;&mdash;开发之时即可掌控ASP.NET应用的性能
- 【PHP设计模式 10_ShiPeiQi.php】适配器模式
- Mplayer 官方中文手册
- DataGridView过滤区分大小写问题
- Java汉字排序(1)排序前要了解的知识(数组和list的排序接口)
- I Take It All Back: Using Windows Installer (MSI) Rollback Actions
- Ubuntu在ARM上建立NFS服务
- 京东商城首页jquery轮播特效
- [转]python json.dumps 中的ensure_ascii 参数引起的中文编码
- 当你想要在conda指定的某个环境中安装包的方法
- 运维监控-使用Zabbix Server 添加自定义 item
- 运行 svgatest 显示 mmap /dev/zero Permission denied 解决办法
- cocos2d JS-(JavaScript) 静态方法的例子
- ::before 伪元素三角
热门文章
- Spring_总结_03_装配Bean(二)_Java配置
- vmware centos 连网方式
- L121
- javascript.history.go();
- [基本操作]决策单调性优化dp
- Two Cakes
- 浅析BMP位图文件结构(含Demo)
- bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)
- (转)AppCan中调用系统浏览器打开网页
- demo1 spark streaming 接收 kafka 数据java代码WordCount示例