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. 6.MySQL优化---高级进阶之表的设计及优化

    转自互联网整理. 优化之路高级进阶——表的设计及优化 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规 ...

  2. AtCoder Beginner Contest 087 D - People on a Line

    Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement There are N people sta ...

  3. Android UI--提高Android UI体验

    1,自定义虚拟键盘 当一个用户被要求在一个文本框输入时希望又怎样的体验?  从用户需求来看,虚拟键盘应该改变以帮助用户输入的数据.这里是一些例子: 如果一个视图是一个电子邮件地址,一个键盘的“@”符号 ...

  4. bzoj 4559 [JLoi2016]成绩比较——拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 关于拉格朗日插值,可以看这些博客: https://www.cnblogs.com/E ...

  5. 洛谷【AT2827】LIS

    浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/A ...

  6. python3 之logging模块

    logging.getLogger(name=None)Return a logger with the specified name or, if name is None, return a lo ...

  7. jenkins学习 03 jenkins配置Maven项目

    我们的产品使用Git作为版本管理工具,而jenkins需要git插件来支持git,所以我们需要为jenkins添加git插件. 在Available tab页中找到Git Plugin 点击下方的In ...

  8. [置顶] 从零制作文件系统到JZ2440,使其支持telnet , ftp 和tftp

    转自:http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328515&idx=1&sn=5849fba4b44e ...

  9. 2007.1.1 string.Format

    String.Format举例(C#) stringstr1 =string.Format("{0:N1}",56789); //result: 56,789.0 stringst ...

  10. MessageBox如何输出整数

    int cx=10;CString s;s.Format(_T("整数是:%d"),cx);MessageBox(s);