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 ;
}

c++ public protected private 继承的更多相关文章

  1. 7,C++ public, protected, private 继承的区别

    在某处看到一张图,简单明了的说明了三者的关系,很是佩服,遂记录下来. //公有继承 对象访问 成员访问 public --> public Y Y protected --> protec ...

  2. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  3. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  4. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

  5. 【转载】C++中public,protected,private访问

    第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...

  6. JAVA修饰符类型(public,protected,private,friendly)

    转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...

  7. C++ 类访问控制(public/protected/private)

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...

  8. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  9. 快速理解类的访问控制(public,protected,private)

    接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...

随机推荐

  1. sass语法(1)

    文件后缀名 sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一种就是我们这里使用的scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号 //文件后缀名为sass ...

  2. KVM- 存储池配置

    1.创建基于文件夹的存储池(目录) [root@kvm_1 ~]# mkdir -p /data/vmfs 2.定义存储池与其目录 [root@kvm_1 ~]# virsh pool-define- ...

  3. php mysql 查询

    抓取结果集对象中数据并且转换数组 $row = mysqli_fetch_assoc(结果集对象); 从结果集对象中抓取一行记录->转换关联数组 $row = mysqli_fetch_row( ...

  4. Debian For ARM Webmin Server

    /******************************************************************************** * Debian For ARM W ...

  5. Debian For ARM mysql-server install information

    /**************************************************************************** * Debian For ARM mysql ...

  6. mac下安装libpng环境

    用go写一个爬虫工具时需要使用一个go的库,而这个库有需要使用libpng库,不然编译就会提示说 png.h找不到等之类的信息,于是想到应该和windows一样需要安装gcc环境,然后让gcc里安装l ...

  7. LeetCode Maximum Average Subarray I

    原题链接在这里:https://leetcode.com/problems/maximum-average-subarray-i/description/ 题目: Given an array con ...

  8. 使用swing构建一个界面(包含flow ,Border,Grid,card ,scroll布局)

    package UI; import java.awt.BorderLayout;import java.awt.CardLayout;import java.awt.Cursor;import ja ...

  9. JavaWeb框架_Struts2_(三)---->Struts2的拦截器

    2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...

  10. vue.js初学(三)模板语法

    1:介绍 vue.js允许开发者声明式地将Dom元素绑定至Vue实例的底层,所有的模板都是合法的html,所以能够被遵循规范的浏览器和html解析器解析 在底层的实现上,vue将模板编译成虚拟Dom渲 ...