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. LeetCode OJ:Kth Smallest Element in a BST(二叉树中第k个最小的元素)

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  2. L122

    These plants have much of the same nutritional value that a real plant has. Search giant Google says ...

  3. 树莓派视频监控 —— 使用 mjpg

    下载到树莓派本地: $ wget https://github.com/jacksonliam/mjpg-streamer/archive/master.zip $ unzip master.zip ...

  4. 用Java实现异构数据库的高效通用分页查询功能

    不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...

  5. 使用自定义端口连接SQL Server 2008的方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 使用过SQL Server的人大多都知道,SQL Server服务器默认监听的端口号是1433,但是我今天遇到的问题是我的机器上有三个数据库实例, ...

  6. PHP:json_encode 保持中文不被转为ASCII码

    echo json_encode(array('黄河之水天上来'),JSON_UNESCAPED_UNICODE);

  7. Java创建AD(Active Directory)域控制器用户 (未测)

    import java.util.Hashtable; import javax.naming.ldap.*; import javax.naming.directory.*; import java ...

  8. (转)AppCan中调用系统浏览器打开网页

    <!DOCTYPE html> <html> <head> <style>body{ background:#fff; font-size:30px;} ...

  9. dijstra+输出路径总结

    #include<iostream> #include<math.h> #include<memory.h> using namespace std; #defin ...

  10. 查看osdmap命令

    标签(空格分隔): ceph,ceph运维,osdmap 方法一: 最直接,简单的命令: [root@node3 ~]# ceph osd tree ID CLASS WEIGHT TYPE NAME ...