作为父类的设计者,你可能会踌躇到底应该使用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?相关推荐

  1. 【C++】多态问题:基类调用子类的protected或者private函数

    1.问题描述 如果在基类中虚函数是public,子类中重载时标记为protected或者private函数,是否还能访问这个函数? 答案是: 基类指针指向子类时,可以访问,并且访问的是子类重载后的函数 ...

  2. 深入理解C++中public、protected及private用法

    深入理解C++中public.protected及private用法 这篇文章主要介绍了C++中public.protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需 ...

  3. C++中public、protected、private的差别

    第一: private,public,protected的訪问范围:   private: 仅仅能由该类中的函数.其友元函数訪问,不能被不论什么其它訪问.该类的对象也不能訪问. protected: ...

  4. 类中的关键字public、protected、private究竟是什么意思?

    类中的关键字public.protected.private究竟是什么意思? 这三个关键字用来修饰类中的成员的有效域,即成员在哪个域内是可被调用的.下面我们来仔细说明这句话. 所谓"类中的成 ...

  5. C++中public,protected,private访问范围和用法

    今天本文就来十分分析一下C++中public,protected,private它们在继承中表示的一些访问范围和用法.这里我们首先要明白下面几点. 1.类的一个特征就是封装,public和privat ...

  6. C++中public、protected及private用法

    转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...

  7. C++ public、protected、private区别

    2018-02-09 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.封装 public 其成员是类与类外的接口,其对象可以访问. protected 只能是类内(自己)以 ...

  8. C++学习笔记:(六)public、protected、private继承详解

    前言 上一篇学习了继承的基础概念以及示例代码.算是对继承有了一个简单的了解.如果想要对继承有更深的了解,就要复习访问权限的知识点.这样才能深化对继承的了解,以及学习不同的继承方式能对哪些数据进行操作. ...

  9. C++中的三种继承public,protected,private(转)

    三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 p ...

  10. C++中public,protected,private的区别

    C++中public,protected,private个人总结为两种概念,一个宗旨. 两种概念: 概念一:静态的 在C++中一个类的成员的访问级别可分为public,protected,和priva ...

最新文章

  1. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
  2. rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
  3. springboot tomcat配置_告诉你,Spring Boot 真是个牛逼货!
  4. luabind-0.9.1在windows、linux下的使用详解及示例
  5. 置信学习:让样本中的“脏数据“原形毕露
  6. 紧急不代表重要:管理时间的六个秘密
  7. python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?
  8. Python之路(第十六篇)xml模块、datetime模块
  9. IDEA轻松实现.class文件反编译(超实用)
  10. 代码记录:易语言中精易模块的json文本数据生成
  11. ai的预览模式切换_ai预览模式怎么退出
  12. 杭州毕业生就业创业补贴全攻略
  13. 【HCIE-RS】TAC诊断1
  14. 如何有效防止“蹭网”——简述Wi-Fi加密方式与破解
  15. 技嘉服务器准系统epyc,技嘉为AMD霄龙处理器推出ATX主板 针对AMD EPYC
  16. 广东工业大学数据库课设(点歌系统)
  17. Request和response的用法总结
  18. Flink系列之Flink流式计算引擎基础理论
  19. RuntimeError: Legacy autograd function with non-static forward method is deprecated.
  20. 可能是东半球最全的RxJava使用场景小结

热门文章

  1. latex怎样让题号顶格_latex proof顶格
  2. 袁老师Py西游攻关之基础数据类型
  3. 1789: 高精度A+B
  4. 青岛大学计算机小姐姐,青岛大学举牌校花一夜爆红,评论区留下脏话:见不得别人好是病!...
  5. jmeter(二十一)jmeter常用插件介绍
  6. java手机游戏ios_我的世界JAVA版本ios版
  7. LabVIEW-数值控件和布尔控件
  8. 网上最全的系统服务,让PF降到50以下(转)
  9. 说说如何在项目中引入 jBPM4 工作流框架以及遇到的坑儿
  10. ARP欺骗的两种方式