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成员仅仅能由类成员(类内)和友元 ...
随机推荐
- 获取class的儿子,报错undefined
var tds = document.getElementsByClassName("dv1")[0].children console.log(tds) 因为cla ...
- XMPP即时通讯协议使用(一)——Openfire安装
Openfire服务器安装 下载地址:https://www.igniterealtime.org/downloads/index.jsp,根据你的操作系统,选择对应的下载版本.本文选择的是openf ...
- skiasharp在阿里云Windows server 2016上部署时提示The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception. 错误
应用环境及问题描述: Windows Server 2016,.Net core 2.1, Skiasharp作为跨平台的图像处理组件在生成缩略图时出错,本地测试都是正常的,部署到服务器无法生成缩略图 ...
- 工作中常用的linux命令大全
文章内容参考:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html 谢谢大佬的分享 系统信息 date 显示系统日期 cal + 年份 显示 ...
- 转载:PhpExcel使用方法
下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...
- linux--mysql的安装与配置
linux centos下,mysql安装有三种方式:二进制tar包安装,rpm安装,yum安装(最简单) 查看有没有安装过: yum list installed mysql* rpm -qa | ...
- vue代理配置之二--dev方式启动的index.js配置
'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for document ...
- java中的进制转换以及字符串类和数值类的相互转化
import java.util.*; import java.io.*; import java.math.*; import java.math.*; public class Main { pu ...
- 洛谷3321 SDOI2015 序列统计
懒得放传送[大雾 有趣的一道题 前几天刚好听到Creed_神犇讲到相乘转原根变成卷积的形式 看到这道题当然就会做了啊w 对于m很小 我们暴力找原根 如果你不会找原根的话 出门左转百度qwq 找到原根以 ...
- 【leetcode】891. Sum of Subsequence Widths
题目如下: 解题思路:题目定义的子序列宽度是最大值和最小值的差,因此可以忽略中间值.首先对数组排序,对于数组中任意一个元素,都可以成为子序列中的最大值和最小值而存在.例如数组[1,2,3,4,5,6] ...