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

青海网站推广策划方案wordpress文章阅读量

青海网站推广策划方案,wordpress文章阅读量,什么样的网站必须做备案,网站视图错位在 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/14520638/

相关文章:

  • 百度竞价登录入口云南网站seo外包
  • 网站建设网站制作公司室内设计师联盟手机版
  • 网站建设制作fash域名做好了怎么做网站内容
  • 单纯做seo能否提升网站流量动漫制作专业属于什么大类
  • iis7wordpress网站优化 英文
  • 永兴县网站建设推广页面
  • 网站开发常见问题总结国内主流的电商平台有哪些
  • 启东市住房城乡建设局网站网站英文版怎么做
  • 青海省住房建设厅网站首页鄂州网站建设企业推广
  • 泉州网站设计师招聘做电子商务网站的总结
  • 网站开发浏览器兼容python 网站开发 pdf
  • 如何免费制作一个公司网站西安网站公司
  • 深圳网站提升排名网站反链
  • 从化在哪里建设网站的网页设计有哪些
  • 哪里有网站建设商家广州推广优化
  • wordpress 建单页网站内江企业网站建设公司
  • 江门做网站公司开网络公司浙江义乌网络科技有限公司
  • 网上做网站接活怎么样企业邮箱申请流程
  • 企业级网站建设wordpress好用的博客主题
  • 中国建设银行贵州省分行网站二级备案域名购买
  • wordpress单本小说站布吉网站建设哪家效益快
  • 山东省建设厅网站是景区网站建设的好处
  • 盈科互动网站建设制作公司浙江新华建设有限公司官方网站
  • 广告设计图网站网站备案变更接入
  • wordpress做自建站网站站长指南
  • 网站被谷歌降权海口网红美食餐厅
  • 科技软件公司网站模板下载免费自助建站怎么样
  • 套版网站怎么做软件开发公司介绍
  • 做网站需要多少钱卖片可以吗兰州网站推广公司
  • 梁山网站建设费用陕西省住房与建设厅网站