当前位置: 首页 > news >正文

青海网站推广策划方案爱给网素材官网

青海网站推广策划方案,爱给网素材官网,网站设计 广西,滕州网站建设招聘在 c 面向对象使用中#xff0c;我们常常会定义一个基类类型的指针#xff0c;在运行过程中#xff0c;这个指针可能指向一个基类类型的对象#xff0c;也可能指向的是其子类类型的对象#xff0c;那现在问题来了#xff0c;我们如何去判断这个指针到底执行了一个什么类型…在 c 面向对象使用中我们常常会定义一个基类类型的指针在运行过程中这个指针可能指向一个基类类型的对象也可能指向的是其子类类型的对象那现在问题来了我们如何去判断这个指针到底执行了一个什么类型的对象呢 今天我们就聊一下这个问题首先我们要区分是否允许 RTTI据此有不同办法。 1 允许使用 RTTI 在打开 rtti 的场景下可以使用 dynamic_cast 和 typeid 这两个运算符来判断对象的真实类型。 1.1 使用 dynamic_cast dynamic_cast 用于在运行时进行多态类型检查和转换它可以将指向基类的指针转换为指向派生类的指针或引用。如果转换成功则说明对象属于目标类或其派生类。如果转换失败则返回空指针。 我们看如下例子我们想判断指针 basePtr 是否指向了 Child2 类型的对象。总共进行了两次测试第一次让该指针指向了 Child1 类型的对象第二次则是指向了 Child2 类型的对象。 #include iostreamclass Basic { public:virtual void say() {std::cout 我是基类 std::endl;} };class Child1 : public Basic { public:void say() {std::cout 我是 child 1 std::endl;} };class Child2 : public Basic { public:void say() {std::cout 我是 child 2 std::endl;} };int main() {Basic* basePtr;basePtr new Child1();if (dynamic_castChild2*(basePtr)) {std::cout [test 1]指针指向了 Child2 类型对象 std::endl;} else {std::cout [test 1]指针没有指向 Child2 类型对象 std::endl;}delete basePtr;basePtr new Child2();if (dynamic_castChild2*(basePtr)) {std::cout [test 2]指针指向了 Child2 类型对象 std::endl;} else {std::cout [test 2]指针没有指向 Child2 类型对象 std::endl;}delete basePtr; }让我们一起看看两次的打印这是符合我们的预期的使用 dynamic_cast 可以判断一个基类类型的指针是否指向了某个具体类类型。 在这里有的朋友会好奇我为什么添加了 say() 这么一个方法凑数吗确实是就是凑数的dynamic_cast 是用于多态运行时的类型检查如果我不增加这么一个方法并且在基类中添加上 virtual 关键字那就不存在多态也就无从谈起运行时多态类型检查。下面是我将 virtual 去掉或者干脆删除 say() 方法的编译结果。 1.2 使用 typeid typeid 运算符返回一个 type_info 对象该对象包含类型的相关信息。通过比较两个指针的类型信息可以确定它们是否具有相同的类型。这里我们不用管 type_info 是什么东西我们主要看看怎么用下面继续看看刚刚的例子。 #include iostreamclass Basic { public:virtual void say() {std::cout 我是基类 std::endl;} };class Child1 : public Basic { public:void say() {std::cout 我是 child 1 std::endl;} };class Child2 : public Basic { public:void say() {std::cout 我是 child 2 std::endl;} };int main() {Basic* basePtr;basePtr new Child1();if (typeid(*basePtr) typeid(Child2)) {std::cout [test 1]指针指向了 Child2 类型对象 std::endl;} else {std::cout [test 1]指针没有指向 Child2 类型对象 std::endl;}delete basePtr;basePtr new Child2();if (typeid(*basePtr) typeid(Child2)) {std::cout [test 2]指针指向了 Child2 类型对象 std::endl;} else {std::cout [test 2]指针没有指向 Child2 类型对象 std::endl;}delete basePtr; }运行结果和刚刚使用 dynamic_cast 一样。我们这里是来判断基类指针是否指向了某个具体类对象typeid 当然也可以用来判断两个指针指向的具体类类型是否相同这里不再展开。 值得注意的是使用 typeid 时如果去掉基类方法中的 virtual 关键字编译并不会报错但运行结果肯定会错此时因为不存在多态该运算符始终会返回基类的信息。 2 不允许使用 RTTI 出于某些原因你的项目可能禁用了 RTTI那这个时候我们应该怎么判断基类指针指向的具体类呢我们还能利用多态本身就是给基类新增一个虚方法子类在必要的时候来重写。 下面我们继续用刚刚的例子一起看看代码吧。 #include iostreamclass Basic { public:virtual void say() {std::cout 我是基类 std::endl;}virtual bool isChild2() {return false;} };class Child1 : public Basic { public:void say() {std::cout 我是 child 1 std::endl;} };class Child2 : public Basic { public:void say() {std::cout 我是 child 2 std::endl;}bool isChild2() {return true;} };int main() {Basic* basePtr;basePtr new Child1();if (basePtr-isChild2()) {std::cout [test 1]指针指向了 Child2 类型对象 std::endl;} else {std::cout [test 1]指针没有指向 Child2 类型对象 std::endl;}delete basePtr;basePtr new Child2();if (basePtr-isChild2()) {std::cout [test 2]指针指向了 Child2 类型对象 std::endl;} else {std::cout [test 2]指针没有指向 Child2 类型对象 std::endl;}delete basePtr; }我们新增了一个 isChild2() 的方法用来判断该类是否是 Child2 类型因为我这里只需要判断基类指针是否指向了 Child2 类型的对象所以就直接增加了个 bool 返回值的接口进行判断了。在实际使用时也可以返回枚举变量分别对应例子中的三个类。 3 总结 当项目允许 RTTI 时我们可以使用 dynamic_cast 和 typeid 运算符来判断一个基类指针指向的具体对象类型当禁用 RTTI 时我们就利用多态本身为基类新增一个方法用来获取类类型信息。
http://www.hkea.cn/news/14269973/

相关文章:

  • html网站开发简历建设网站英语
  • 上海外贸网站建设公司wordpress 自定义筛选
  • 网站设计论文的题目网站建设汕头
  • 设计网站都有什么作用是什么广安商城网站建设
  • 从零做网站网站可以做10000件事情吗
  • 泉州网页模板建站wordpress修改最大上传图片
  • 建设网站用什么语言比较好做ppt好的网站有哪些方面
  • php网站开发实例pdf网站开发 项目规划 怎么写
  • seo推广案例seo职位具体做什么
  • 商城网站数据库表关系设计互联网信息平台
  • 创建一个网站需要什么条件做宠物网站赚钱吗
  • 想在网上做设计接单有没有网站创鑫时代广告公司简介
  • 建设银网官方网站杭州建站软件
  • 手机购物网站怎么推广wordpress tinymce
  • 在哪里做百度网站关键词排名查询api
  • 网站网址模板黑客入侵网站怎么做
  • 建设部指定招标网站设计网站开发方案流程
  • php做网站界面代码太原网站建设平台
  • 网站建设相关费用徐州最新通知
  • 网站 建设在作用是什么意思微信授权登录第三方网站开发
  • 工业网站模板租车网站模板下载
  • 安庆市建设银行网站首页WordPress批量删除无用标签
  • 阿里云怎么做网站建造师查询官网
  • 百度 如何 关键字 网站域名 关联有没有可以做游戏的网站
  • 如何做期货培训网站网站一般字体
  • 单页导航网站国家大宗商品交易平台
  • 商城网站怎么建设汕头达濠
  • 惠州 网站建设app开发做音乐的网站
  • 网站是先解析还是先备案实验室规划设计厂商
  • 手机网站跳出率低网站备案接口