相信通过之前的学习,你也已经对类有了深刻的了解,那么请利用你所学的知识,想一想下面这道题。

/* 函数名: foo* 函数声明:* template <class B, class D>* bool foo();* 函数注解:* B代表判断基类* D代表判断子类* foo返回一个布尔值* 如果D是B的子类,返回true* 如果D不是B的子类,返回false*/

很新奇的题目吧,你可能一下子被蒙住了。这道题牵涉到函数重载(overload),下面就是本题答案。

/* 函数名: foo* 函数声明:* template <class B, class D>* bool foo();* 函数注解:* B代表判断基类* D代表判断子类* foo返回一个布尔值* 如果D是B的子类,返回true* 如果D不是B的子类,返回false*/template <class B, class D>
class Inherit
{public:bool result();
protected:bool foo(B *var);bool foo(void *var);
};
bool Inherit::result()
{D *d = 0;return foo(0);
}
bool Inherit::foo(B *var)
{return true;}
bool Inherit::foo(void *var)
{return false;}template <class B, class D>
bool foo()
{return Inherit<B,D>().result();}

思路就是,通过函数重载,对于B的子类,将调用bool foo(B *var),对于其他类型,将调用bool foo(void *var)
这是因为从子类指针到父类指针比从指针到void *的距离短
当然我一开始也并不觉得是这样,因为这怎么又可比性呢?我认为会报错的。
但我亲自尝试了一下,发现确实可行。

再来一道和多态有关的。

/* 函数名: foo* 函数声明:* template <class B, class D>* bool inherits(B *var);* 函数注解:* B代表判断子类* D代表判断基类* D一般是B的子类(不一定是)* var的类型可以是B,也可以是B的子类(多态)* 如果var的类型是D的子类,foo返回true* 如果var的类型不是D的子类,foo返回false*/

这道题有点绕,举个例子

class A {};
class B: public A {};
class C {};int main()
{A *a = new B;foo<B>(a); // 返回true,因为a的类型是B,B是B的子类foo<C>(a); // 返回false,因为a的类型是B,B不是C的子类B *b = new B;foo<A>(b); // 返回true,因为b的类型是B,B是A的子类delete a.b;
}

就需要满足上述的效果。
这道题要用到动态类型转换(dynamic cast),你可能不知道

template <class B, class D>
bool foo(B *var)
{D *d = dynamic_cast<D *>(var);return !!d;
}

代码很短,主要是第3行的dynamic_cast,这个运算符可以帮助我们判断var是不是D的子类
dynamic_cast允许把一个原本为子类的父类变量转为原本类型的父类。
听起来有点绕口,其实很简单。
假如A->B->C,即CB的子类,BA的子类
现有变量C *var,利用多态特性转换为A *var,那么我们就不能直接看出var是否继承B,这时dynamic_cast可以试图将var转换为B *类型,如果成功,返回转换后的值,如果失败,返回空指针。
这就正好满足了我们的需求。
dynamic_cast运行较慢,好像是通过源代码查找的方式确定的。
所以能用第一种就用第一种。

本序列的文章:
C++类的使用(一)
C++类的使用(二)—— explicit构造与const成员变量赋值
C++类的使用(三)—— 封装
C++类的使用(四)—— 继承
C++类的使用(五)—— 多态
C++类的使用(六)—— 判断继承

C++类的使用(六)—— 判断继承相关推荐

  1. C++实验六:继承,对BMP图片操作

    功能介绍: 图片翻转.旋转.剪切.任意缩放.图片相加.图片相减等等 复杂功能解释基本都写在注释中了,对于图片缩放,可谓本次实验之精华(搞人心态) 其次,关于resize函数的重载,应该private掉 ...

  2. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  3. 前端与移动开发----JS高级----面向对象编程,类与实例对象,继承,严格模式,模板字符串,class封装tab栏

    JS高级01 回顾上阶段 Javascript组成 ECMAScript: 基础语法 (变量, 表达式, 循环, 判断, 函数, 对象等) DOM: document 操作标签(获取, 增加, 插入, ...

  4. c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

    一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std;class Parent{ ...

  5. 【C++面向对象】类的大小以及虚继承

    先看下面一段代码: #include <iostream>using namespace std;class X{}; class Y:public virtual X{}; class ...

  6. C#中增量类功能的方式之 继承与扩展

    之前一次公司培训的时候,将它记录下来,https://www.cnblogs.com/AlvinLee/p/10180536.html这个博客上面比较全面. 1.扩展方法 扩展方法是一种特殊的静态方法 ...

  7. 继承类 基类的赋值_Chapter10:继承与派生(四)

    之前的文章把继承和派生的基本概念和内部原理都大致理清了.但是类可以视作是一种特殊的数据类型--它也具有转换的功能,称为转型,这一节展开讨论它,以及如何通过指针跨越权限访问不同成员的技巧. 1.类的转型 ...

  8. C++程序设计(六)—— 继承和派生

    一.继承和派生的基本概念 从一个或多个以前定义的类(基类)产生新类的过程称为派生,这个新类称为派生类.基类和派生类又可以分别叫做父类和子类.派生的新类可以增加或重新定义数据和操作,这就产生了类的层次性 ...

  9. 定义一个名为Cylinder类表示圆柱,它继承Circle类

    这里写目录标题 题目描述: Circle类 运行结果 Cylinder类 运行结果 题目描述: (1)定义一个名为Circle的类表圆,其中含有double型的成员变量centerX.centerY表 ...

最新文章

  1. 在CentOS7上部署Apache Mesos
  2. 再见Python!Yann LeCun警告:深度学习需要新编程语言
  3. $.fn.extend简单学习
  4. 使用OKHttp3实现下载(断点续传、显示进度)
  5. aws lambda使用_使用AWS Lambda的CloudWatch事件通知
  6. python中for和while可以有else_Python 中的for,if-else和while语句
  7. 今日上新:两个图像领域的现金奖励实时竞赛
  8. 时光就是一颗巨大的牛轧糖
  9. POJ3321 Apple tree
  10. 如何做一个让开发人员看得起的软件测试人员
  11. c++ 4种新型的类型static_cast、dynamic_cast、reinterpret_cast、const_cast转换运算符
  12. C#学习(二十八)——ManualResetEvent的理解和使用
  13. MATLAB GUI编程总结
  14. 数学符号大全(量词符号、代数符号等)
  15. MMDetection学习教程(一)
  16. Tensorflow2 model.compile()理解
  17. QML 语法(Syntax)
  18. 考取PMP认证有用吗?
  19. 抖音恶心的整人代码~~~VBS代码
  20. Python -- 网络编程

热门文章

  1. 记录处理搜狗新闻分类
  2. 关于无法加载sass 模块问题。vue2.0中报错ERROR :scss can't resolve 'scss-loader'
  3. Hugging Face官方课程来了!Transformers库维护者之一授课,完全免费
  4. 进化计算在深度学习中的应用 | 附多篇论文解读
  5. 详解深度学习中的Normalization,不只是BN(2)
  6. 计算机视觉:基于YOLO-V3林业病虫害目标检测
  7. 【教程】Jupyter notebook基本使用教程
  8. 10taskkill无法终止进程_?进程的状态转换
  9. html中js添加或删除activex,JS:操作样式表2 :用JS实现添加和删除一个类名的功能(addClass()和removeClass())...
  10. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试