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

做网站泉州公关工资一般多少钱一个月

做网站泉州,公关工资一般多少钱一个月,网络软文营销的案例,2345浏览器主页网址在 c 面向对象使用中,我们常常会定义一个基类类型的指针,在运行过程中,这个指针可能指向一个基类类型的对象,也可能指向的是其子类类型的对象,那现在问题来了,我们如何去判断这个指针到底执行了一个什么类型…

在 c++ 面向对象使用中,我们常常会定义一个基类类型的指针,在运行过程中,这个指针可能指向一个基类类型的对象,也可能指向的是其子类类型的对象,那现在问题来了,我们如何去判断这个指针到底执行了一个什么类型的对象呢?
在这里插入图片描述

今天我们就聊一下这个问题,首先我们要区分是否允许 RTTI,据此有不同办法。

1 允许使用 RTTI

在打开 rtti 的场景下,可以使用 dynamic_casttypeid 这两个运算符来判断对象的真实类型。

1.1 使用 dynamic_cast

dynamic_cast 用于在运行时进行多态类型检查和转换,它可以将指向基类的指针转换为指向派生类的指针或引用。如果转换成功,则说明对象属于目标类或其派生类。如果转换失败,则返回空指针。
我们看如下例子,我们想判断指针 basePtr 是否指向了 Child2 类型的对象。总共进行了两次测试,第一次让该指针指向了 Child1 类型的对象,第二次则是指向了 Child2 类型的对象。

#include <iostream>class 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_cast<Child2*>(basePtr)) {std::cout << "[test 1]指针指向了 Child2 类型对象" << std::endl;} else {std::cout << "[test 1]指针没有指向 Child2 类型对象" << std::endl;}delete basePtr;basePtr = new Child2();if (dynamic_cast<Child2*>(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 <iostream>class 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 <iostream>class 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_casttypeid 运算符来判断一个基类指针指向的具体对象类型;当禁用 RTTI 时,我们就利用多态本身,为基类新增一个方法,用来获取类类型信息。

http://www.yayakq.cn/news/536157/

相关文章:

  • 网站建设嘉兴公司电话免费推广产品的平台
  • 顶岗实践网站开发页面模板发布别人能看到吗
  • 登封网站制作seo优化营销专员招聘
  • 兴国电商网站建设网站做预览文档
  • 做英文网站需要哪些东西大连建设网网址
  • 安平县英文网站建设深圳坪山高铁站
  • 网站网页建设佛山制作
  • 公司网站免费建站龙岗网站建设网站制作
  • 食品企业网站建设最近国际重大新闻事件2022
  • 通辽网站公司wordpress如何绑定多个域名
  • 有哪些网站做的比较好看的图片东莞智通人才网登录
  • 建站建设流程淘客网站怎么做
  • 北安网站建设长春网站快照优化公司
  • 网站建设的招标文件前端网站开发
  • 服装建设网站的原因手机网站源程序
  • 四站合一网站制作网站建设找什么公司
  • 自己的卡盟网站怎么做分站中标查询
  • 搭建网站php源码企业年金辞职了就白交了吗
  • 贸易公司做推广的网站建筑企业登录建设厅网站密码
  • 科技九洲君云seo
  • 毕设做网站答辩稿怎么做线上销售
  • php网站支付宝接口美图秀秀在线制作图片
  • 怎么看网站有没有做404垦利县企业型网站建设
  • jsp是做网站后台的吗外贸多语言网站
  • 谢岗网站建设东莞免费建网站企业
  • 昌图门户网站装饰画图片大全
  • 网站界面ui设计汕头网站关键词推广
  • 安全员怎么网站中做备案网站的后端用什么软件做
  • 南京网站设计课程电子商务网站建设类论文
  • 微网站如何建立新十条优化措施