Protected or Private?
作为父类的设计者,你可能会踌躇到底应该使用protected还是private来描述你的成员。那么,让我们来看看下面几个Sample吧:
1、不相关的类访问protected成员
void B::yourfun(A &a)
{
class ASpe:public A
{
friend class B;
};
static_cast<ASpe &>(a).ProtectFun();
}
尽管static_cast<ASpe &>的结果是undefined,但是因为这里的static_cast通常都是no-op,而且编译器一般都会对ASpe作空派生类优化,因此上面的代码在实际应用中几乎肯定可以成功。
对于一个恶意用户而言,他的目的已经达到了。
2、调用纯虚函数
class A {
protected:
virtual void Fun() =0;
};
class B:public A
{
public:
B() {Dummy();}
private:
void Dummy() {Fun();}
};
class C:public B
{
public:
virtual void Fun() {}
};
你觉得不可能调用传说中的纯虚函数?你想看看_purecall到底会作些什么?试试上面的代码吧。问题的根源在于父类将Fun声明成了protected。
当然你不应当在ctor里调用virtual函数,但是你在ctor调用Dummy的时候,并不一定会注意到Dummy内部会调用virtual函数,于是灾难发生了
如果你仅仅希望子类在virtual函数中提供某种行为,那么把这些函数声明成private吧
尽管上面的代码都不符合标准,但是至少说明,你的用户可以利用你提供的protected权限实现一些你并不希望赋予子类的功能。
如果你觉得连private都不放心(譬如邪恶的#define private public,当然它违反了标准17.4.3.1.1,因此结果是不可预期的),那么你最好使用PImpl来实现你的接口
Protected or Private?相关推荐
- 【C++】多态问题:基类调用子类的protected或者private函数
1.问题描述 如果在基类中虚函数是public,子类中重载时标记为protected或者private函数,是否还能访问这个函数? 答案是: 基类指针指向子类时,可以访问,并且访问的是子类重载后的函数 ...
- 深入理解C++中public、protected及private用法
深入理解C++中public.protected及private用法 这篇文章主要介绍了C++中public.protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需 ...
- C++中public、protected、private的差别
第一: private,public,protected的訪问范围: private: 仅仅能由该类中的函数.其友元函数訪问,不能被不论什么其它訪问.该类的对象也不能訪问. protected: ...
- 类中的关键字public、protected、private究竟是什么意思?
类中的关键字public.protected.private究竟是什么意思? 这三个关键字用来修饰类中的成员的有效域,即成员在哪个域内是可被调用的.下面我们来仔细说明这句话. 所谓"类中的成 ...
- C++中public,protected,private访问范围和用法
今天本文就来十分分析一下C++中public,protected,private它们在继承中表示的一些访问范围和用法.这里我们首先要明白下面几点. 1.类的一个特征就是封装,public和privat ...
- C++中public、protected及private用法
转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...
- C++ public、protected、private区别
2018-02-09 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.封装 public 其成员是类与类外的接口,其对象可以访问. protected 只能是类内(自己)以 ...
- C++学习笔记:(六)public、protected、private继承详解
前言 上一篇学习了继承的基础概念以及示例代码.算是对继承有了一个简单的了解.如果想要对继承有更深的了解,就要复习访问权限的知识点.这样才能深化对继承的了解,以及学习不同的继承方式能对哪些数据进行操作. ...
- C++中的三种继承public,protected,private(转)
三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 p ...
- C++中public,protected,private的区别
C++中public,protected,private个人总结为两种概念,一个宗旨. 两种概念: 概念一:静态的 在C++中一个类的成员的访问级别可分为public,protected,和priva ...
最新文章
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
- rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
- springboot tomcat配置_告诉你,Spring Boot 真是个牛逼货!
- luabind-0.9.1在windows、linux下的使用详解及示例
- 置信学习:让样本中的“脏数据“原形毕露
- 紧急不代表重要:管理时间的六个秘密
- python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?
- Python之路(第十六篇)xml模块、datetime模块
- IDEA轻松实现.class文件反编译(超实用)
- 代码记录:易语言中精易模块的json文本数据生成
- ai的预览模式切换_ai预览模式怎么退出
- 杭州毕业生就业创业补贴全攻略
- 【HCIE-RS】TAC诊断1
- 如何有效防止“蹭网”——简述Wi-Fi加密方式与破解
- 技嘉服务器准系统epyc,技嘉为AMD霄龙处理器推出ATX主板 针对AMD EPYC
- 广东工业大学数据库课设(点歌系统)
- Request和response的用法总结
- Flink系列之Flink流式计算引擎基础理论
- RuntimeError: Legacy autograd function with non-static forward method is deprecated.
- 可能是东半球最全的RxJava使用场景小结