C++ Primer---- 奇怪的 protected 成员
protected 成员在 C++ Primer 第四版中有如下描述:
可以认为 protected 标号是 private 和 public 的混合:
1. 像 private 成员一样, protected 成员不能被类的用户访问。
2. 像 public 成员一样, protected 成员可被该类的派生类访问。
此外, protected 还有另一个重要性质:
3. 派生类只能通过派生类对象访问其基类的 protected 成员, 派生类对其基类类型对象的 protected 成员没有特殊的访问权限。
前两点比较好理解: 基类希望 protected 成员能够被派生类访问,但是又不希望类的用户访问, 所以 protected 成员的被访问权限介于 public 和 private 之间。
第三点,读起来总是感觉很绕,不知所云。
其实是以下的这个意思:
在派生类的定义中:可以通过派生类的对象访问 这个派生类对象的 protected 成员, 而不能通过基类的对象直接访问 protected 成员。。
注意, *this 其实也是一个派生类对象(它绑定了当前的派生类对象),所以在派生类定义中,可以直接访问本对象的基类的 protected 成员。
class Derivative :... Base{
..................派生类中
}
不知道大家理解没有?? 看了下面的例子,想必大伙就能明白了。。
/**
* @file protected-member.cc
* @brief test usage of protected member
* @author shoulinjun@126.com
* @version 0.1.00
* @date 2014-03-19
*/
#include <iostream>
using namespace std; class Base{
public:
Base(int x=0): pro(x){}
protected:
int pro;
}; class Derivative : public Base{
public:
Derivative(int x=0): Base(x) {}
void Print(Derivative &d, Base &b){
cout << "this->protected: " << pro << endl;
cout << "d.protected: " << d.pro << endl; // error not allowed to access base.pro
// cout << "b.protected: " << b.pro << endl;
}
}; int main(void)
{
Base b(0);
Derivative d1(1), d2(2); d1.Print(d2, b); // error
// cout << b.pro << endl;
// cout << d1.pro << endl; return 0;
}
C++ Primer---- 奇怪的 protected 成员的更多相关文章
- java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...
- C++中的public、private、protected成员继承问题
我是C++菜鸟,刚学了一点C++. 先看例子1: /* Item.h */ #include <iostream> #include <string> class It ...
- C#派生类中使用基类protected成员的方法
我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...
- Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限
一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...
- C# 成员默认访问权限(public、private、protected、internal)
C# 成员默认访问权限(public.private.protected.internal) 来源 https://www.cnblogs.com/yezongjie/p/20181121Access ...
- C++ primer(十三)--类继承、构造函数成员初始化、虚函数、抽象基类
一.基类 从一个类派生出另一个类时,原始类称为基类,继承类称为派生类. 派生类对自身基类的private成员没有访问权限,对基类对象的protected成员没有访问权限,对派生类对象的(基类之 ...
- 转载:看c++ primer 学习心得
学习C++ Primer时遇到的问题及解释 chenm91 感觉: l 啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...
- C++ Primer 有感(面向对象编程)
1.除了构造函数之外,任意非static成员函数都可以是虚函数.保留字virtual只在类内部的成员函数声明处出现,不能用在类定义体外部出现的函数定义上. 2.派生类只能通过派生类对象访问其基类的pr ...
随机推荐
- robotframework笔记23
远程库接口 远程库接口提供了对在测试库 比机器人框架本身是在不同的机器上运行, 同时实现图书馆使用其他语言比 本机支持Python和Java. 为一个测试库用户远程 library看起来几乎一样的其他 ...
- 8个实用的页面布局和用户界面jQuery插件
网页设计师和网页开发人员在做项目的时候可能会有一些页面的布局或者对于UI有一些特定的要求.可能一些需求不能单独使用CSS就能实现的.于是很多时候开发人员都会消耗大量的时间和精力去写一些JS来协助实现. ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- 笔记13:File 类的一些操作
一.对文件的创建(create) private void button1_Click(object sender, EventArgs e) { File.Create(@"F:\\QQP ...
- Linux配置邮箱发送(MUTT/MSMTPQ)
配置邮箱发送 http://www.ilanni.com/?p=10589
- hdu----149850 years, 50 colors(最小覆盖点)
50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 初学java之常用组件
import javax.swing.*; import java.awt.*; class Win extends JFrame { JTextField mytext; // 设置一个文本区 JB ...
- 手动实现KVO
前言 KVO(Key-Value Observing, 键值观察), KVO的实现也依赖于runtime. 当你对一个对象进行观察时, 系统会动态创建一个类继承自原类, 然后重写被观察属性的sette ...
- linux ps命令介绍
来源<鸟哥的linux私房菜> ps:将某个时间点的程序运作情况撷取下来 [root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ...
- mysql 在insert 时防止出现主键冲突错误的方法
在mysql中插入数据的时候常常因为主键存在而冲突报错,下面有两个解决方法: 1.在insert 语句中添加ignore 关键字,如:insert ignore into table (id,name ...