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

成都网站建设 小兵雍熙网站建设

成都网站建设 小兵,雍熙网站建设,商城网站seo,苏州网站seo优化RTTI RTTI是什么 RTTI是运行阶段类型识别,通过运行时类型识别,程序能够使用基类的指针或者引用来检查这些指针或者引用所指向的对象的实际派生类型。 RTTI的三个元素 dynamic_cast运算符 dynamic_cast概念: dynamic_cast运算符能够将基…

RTTI

RTTI是什么

RTTI是运行阶段类型识别,通过运行时类型识别,程序能够使用基类的指针或者引用来检查这些指针或者引用所指向的对象的实际派生类型。

RTTI的三个元素

dynamic_cast运算符

dynamic_cast概念:

dynamic_cast运算符能够将基类+的指针或引用安全的转换成派生类的指针或者引用

dynamic_cast语法:

dynam_cast<Type*>(pt);

dynamic_cast案例演示:

假设定义了如下类

#include<iostream>using std::cout;
using std::endl;class A
{
public:virtual void func1() { cout << "这是A的func1函数" << endl; }virtual void func2() { cout << "这是A的func2函数"; }
};
class B : public A
{
public:virtual void func1() { cout << "这是B的func1函数" << endl; }virtual void func2() { cout << "这是B的func2函数"; }void func3() { cout << "B的func3函数"; }
};
class C : public A
{
public:virtual void func1() { cout << "这是C的func1函数" << endl; }virtual void func2() { cout << "这是C的func2函数"; }
};

 如何通过基类指针调用派生类的成员函数呢?

int main()
{A* p_a = new B;p_a->func3();return 0;
}

 这样调用会直接报错,因为A类中没有func3函数,要使用B类方法必须要将指针转换成B类指针才可以

	B* p_b = (B*)p_a; //c风格的强制类型转换,可能会导致错误p_b->func3()

 强制类型转换可以将指针进行转换,但无法指出转换的安全性与合适性:就好别人传来一个指针,你需要确定这个是否为你想要转换的类型,这时使用dynamic_cast就非常有必要

B* p_b1 = dynamic_cast<B*>(p_a); // p_a指向的是B类型的对象,所以可以转换成功
if(p_b1 != nullptr) cout << "p_a实际是一个B类型" << endl;
else cout << "p_a不是B类型,转换失败" << endl;

对于引用类型转换失败,会报出一个异常,std::bad_cast。

A* pa_0 = new B;
A & pa_1 = * pa_0
try
{B & pb_0 = dynamic_cast< B& >(pa_1);cout << "pa_0 是B对象的引用 " << endl;
}
catch(std:bad_cast)
{cout << " pa_1 不是对象B的引用 " << endl;
}

typeid运算符

typeid运算符概念:

typeid运算符:拿到对象信息typeid就会返回一个常量对象的引用,这个常量对像是一个标准库类型type_info(类/类型)

typeid用法:

typeid(类名),typeid(结果为对象的表达式),typeid 常用于确定两个对象是否是同一类型。

案例演示

A* pa1 = new B;
B* pa2 = new B;if(typeid(pa1) == typeid(pa2)) cout << "yes" << endl;
else cout << "no" << endl;

 注意不要把typeid用来识别指针,这样他只是识别定义时的类型,应该传递对象。

A* pa1 = new B;
B* pa2 = new B;if(typeid(*pa1) == typeid(*pa2)) cout << "yes" << endl;
else cout << "no" << endl;

 在这里可以使用等号的原因是,type_info类重载了==和!=运算符,所以可以使用这些运算符来进行类型的比较

typeid().name()将返回实际类型

char a;
int b;
A * pa = new B;cout << typeid(*pa).name() << endl; // 返回class B
cout << typeid(a).name() << endl; // 返回char
cout << typeid(b).name() << endl; // 返回int
http://www.yayakq.cn/news/215858/

相关文章:

  • 做公司网站怎么删除图片公司做一个网站如何定位
  • 软件开发接单网站大兴安岭地网站seo
  • 免费网站建设那个好o2o网站建设方案ppt
  • 做网站一般要了解哪些移动登录网页模板免费下载
  • 网站建设图片怎么做asp.net开发移动网站模板下载
  • 网站和微信对接广东最新消息
  • 看到网站的第一印象环保局 网站建设
  • 中企动力网站icp备案通知大型网站 php
  • 规划网站开发总体方案制作软件app有哪些
  • 斯皮尔网站建设网站刷流量会怎么样
  • 秦皇岛做网站的公司珠海高端网站设计
  • 手机网站自动适配杭州网站建设开发
  • 网站建设如何网页游戏网站哪个好
  • 用php做网站和go做网站做网站能力介绍
  • 网站外链建设周期qq推广赚钱
  • 网站栏目结构图模板100平米美容院装修设计
  • 如何做百度推广网站网站开发需要多少钱价格
  • 做优化网站软件制作专业
  • 郑州网站建设乙汉狮网络网页设计html代码大全咋结啥
  • wordpress 上传文件大小重庆网站优化方式
  • 网站策划方案实例亚马逊跨境电商平台官网
  • 哪里有好的网站搭建网站用什么框架
  • 站长工具seo综合查询下载个人博客网页制作代码
  • 网站开发维护印花税泰安58路
  • 文化建设 设计公司网站厦门建设银行网站首页
  • 怎么做酒店网站网站面板
  • 郑州网站优化seo网站构建是什么意思
  • 德清网站建设中心Wordpress 导航条样式
  • vue 实现网站开发陌陌引流推广软件
  • 李氏牛仔网站建设风仿网站被封怎么办