C++中继承的protected访问级别
1,子类是否可以直接访问父类的私有成员?
2,根据面向对象理论:

根据 C++ 语法:

3,继承中的访问级别编程实验:
#include <iostream>
#include <string> using namespace std; class Parent
{
private:
int mv; public:
Parent()
{
mv = ;
} int value()
{
return mv;
}
}; class Child : public Parent // Child 虽然是 Parent 的子类,但是严格意义上来说,它绝对是 Parent 的外部,因此 Parent 不可以访问 Parent 类的私有成员;
{
public:
int addValue(int v)
{
mv = mv + v; // 这里访问了两次 mv,编译器则显示了两次编译错误,在同一个地方;如何访问父类的非公有成员?
}
}; int main()
{
return ;
}
4,继承中的访问级别:
1,面向对象中的访问级别不只是 public 和 private:
2,可以定义 protected 访问级别;
3,关键字 protected 的意义;
1,修饰的成员不能被外界直接访问;
2,修饰的成员可以被子类直接访问;
5,protected 初体验编程实验:
#include <iostream>
#include <string> using namespace std; class Parent
{
protected:
int mv;
public:
Parent()
{
mv = ;
} int value()
{
return mv;
}
}; class Child : public Parent
{
public:
int addValue(int v)
{
mv = mv + v;
}
}; int main()
{
Parent p; cout << "p.mv = " << p.value() << endl; // 100; // p.mv = 1000; // error,除子类之外的外界不能访问; Child c; cout << "c.mv = " << c.value() << endl; // 100; c.addValue(); cout << "c.mv = " << c.value() << endl; // 150; // c.mv = 10000; // error,除子类之外的外界不能访问; return ;
}
6,为什么面向对象中需要 protected ?
1,所有的开发者应该都有一个架构师德梦想,架构师需要具备的一个素质就是设计能力,我们在做开发的时候,也许系统需要这个功能、也许不需要,究竟需不需要呢?一个系统中并不是功能越多越好,因此我们必须要有设计能,学习过程中要多思考;
2,从生活中入手来思考,女孩子整容否、男孩子尿床、同性恋否,这些信息就是 private 的,生活中的工资是隐私,但是家人可以知道,这是就是 protected;
3,protected 的引入是必须的、绝对的,没有它的引入,面向对象就是不完善的;
4,其他的面向对象语言中如 Java、C# 等,它们当中的访问权限不止三种;
7,定义类时访问级别的选择:

1,左右分支的不同之处在于,是否会被继承,这也是 protected 选择与否的根本依旧;
8,组合与继承的综合实例:

1,这张图中 Object 这个类就是用来被继承的;
2,Line 这个类组合了 Point 这个类;
3,综合实例编程实验:
#include <iostream>
#include <string>
#include <sstream> using namespace std; class Object // 就是用来被继承的;
{
protected: // 就是被继承
string mName;
string mInfo; public:
Object()
{
mName = "Object";
mInfo = "";
} string name()
{
return mName;
} string info()
{
return mInfo;
}
}; class Point : public Object // 点这个类不需要被继承;
{
private:
int mX;
int mY; public:
Point(int x = , int y = )
{
ostringstream s; mX = x;
mY = y;
mName = "Point"; s << "P(" << mX << ", " << mY << ")"; mInfo = s.str();
} int x()
{
return mX;
} int y()
{
return mY;
}
}; class Line : public Object // 不会被继承;
{
private:
Point mP1;
Point mP2; public:
Line(Point p1, Point p2) // 这里编译错误,因为要调用默认构造函数,但是 Point 已经定义了构造函数,此刻可以采用赋默认值的方式;
{
ostringstream s; mP1 = p1;
mP2 = p2;
mName = "Line"; s << "Line from " << mP1.info() << " to " << mP2.info(); mInfo = s.str();
} Point begin()
{
return mP1;
} Point end()
{
return mP2;
}
}; int main()
{
Object o;
Point p(, );
Point pn(, );
Line l(p, pn); cout << o.name() << endl; // 单元测试;Object
cout << o.info() << endl; // 单元测试;“ ” cout << endl; cout << p.name() << endl; // 单元测试;Point
cout << p.info() << endl; // 单元测试;p(1, 2) cout << endl; cout << l.name() << endl; // Line
cout << l.info() << endl; // Line from p(1, 2) to p(5, 6) return ;
}
9,小结:
1,面向对象中的访问级别不只是 public 和 private;
2,protected 修饰的成员不能被外界所访问;
3,protected 使得子类能够访问父类的成员;
1,子类继承父类后,子类和父类中相同的代码各有一套,分别存储使用的。
4,protected 关键字是为了继承而专门设计的;
5,没有 protected 就无法完成真正意义上的代码复用;
1,因为 private 不能继承,而 public 不用继承,但是有些信息又是介乎两者之间的;
C++中继承的protected访问级别的更多相关文章
- 解析Visual C# 7.2中的private protected访问修饰符
去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private pro ...
- C++中public、protected及private用法
转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...
- Java中public,private,protected,和默认的区别
Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...
- C++中public、protected、private
C++中public.protected.private 第一:private, public, protected 访问标号的访问范围. private:只能由 1.该类中的函数. 2.其友元函数 ...
- C++中继承与抽象类
继承语法格式如下: class 子类名称 : 继承方式(public private protected 三种) 父类名称 纯虚函数格式: virtual 返回值类型 函数名(参数列表)= 0:含有纯 ...
- 深入理解C++中public、protected及private用法
深入理解C++中public.protected及private用法 这篇文章主要介绍了C++中public.protected及private用法,对于C++面向对象程序设计来说是非常重要的概念 ...
- 【转】深入理解C++中public、protected及private用法
首先明白以下两点: 1.类的一个特征就是封装,public和private作用就是实现这一目的. 即:用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由类成 ...
- C++中public、protected、private的差别
第一: private,public,protected的訪问范围: private: 仅仅能由该类中的函数.其友元函数訪问,不能被不论什么其它訪问.该类的对象也不能訪问. protected: ...
- C++中public、protected及private使用方法
1.类的一个特征就是封装,public和private作用就是实现这一目的.所以: 用户代码(类外)能够訪问public成员而不能訪问private成员:private成员仅仅能由类成员(类内)和友元 ...
随机推荐
- AJAX 获取Servlet文件路径
下面均不行: xmlRes.open("get","edu/hust/ajax/TestServlet",true); xmlRes.open("ge ...
- worldcloud库的使用
worldcloud库的使用 worldcloud是一个优秀的第三方词云展示库,用来实现比较有逼格的数据可视化效果.更加直观与艺术的展示单词. worldcloud对象的创建 worldcloud.W ...
- 四 shell基本命令
一 内置命令 hlep 命令 帮助 help test help -s printf 显示内置命令的语法格式 echo 用来显示一行文字 echo "hello world&quo ...
- 解决IDEA项目名称无下标蓝色小方块
点击下图中 + 号,引入该工程的pom.xml即可 .
- head、tail 命令和实时(real-time)更新
head.tail 命令和实时(real-time)更新 head filename: 输出 filename 文件的前10项 tail filename: 输出 filename 文件的后10项 即 ...
- 内存中的Buffer和Cache的区别
Reference:https://time.geekbang.org/column/article/74633 磁盘是一个块设备,可以划分为不同的分区:在分区之上再创建文件系统,挂载到某个目录,之后 ...
- 4412 make menuconfig和make
一.Menuconfig的操作 • Linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉• menuconfig是生成.config的一个工具• 在Linux发展过程中,配置内核 ...
- flutter页面布局二
Stack 在flutter中,Stack表示堆的意思,可以用来实现页面的定位布局. Stack组件接收两个可选参数: alignment:配置所有子元素的显示位置 children:子组件 在 ...
- JQUERY的$(function(){})和window.onload=function(){}的区别【转】
在Jquery里面,我们知道入口函数有两种写法:$(function(){}) 和$(document).ready(function(){}) 作用类似于传统JavaScript中的window.o ...
- RHEL 使用epel源
转自http://www.linuxidc.com/Linux/2012-10/71850.htm 设置epel源.方法如下: 32位系统选择:rpm -ivh http://download.Fed ...