第66课 C++中的类型识别
1. 类型识别
(1)在面向对象中可能出现下面的情况
①基类指针指向子类对象
②基类引用成为子类对象的别名

▲静态类型——变量(对象)自身的类型(定义变量类型时类型或参数类型)
▲动态类型——指针(引用)所指向的对象的实际类型
(2)基类指针转子类指针:
①示例:Derived* d = static_cast<Derived*>(pBase); //危险的转换方式
②问题:不安全,是否能强制类型转换取决动态类型。
2. 利用多态获取动态类型
(1)解决方案
①在基类中定义虚函数,并返回具体的类型信息
②所有的派生类都必须实现类型相关的虚函数
③每个类中的类型虚函数都需要不同的实现
【编程实验】动态类型识别
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
//在基类中提供个用来判断类型的虚函数
//并且所有的派生类中都必须实现这个函数
virtual string type()
{
return "Base"; //手动返回一个用于识别的标识符
}
};
class Derived : public Base
{
public:
string type()
{
return "Derived";
}
void print()
{
cout << "I'm a Derived." << endl;
}
};
class Child : public Base
{
public:
string type()
{
return "Child";
}
};
void test(Base* b)
{
//危险的转换方式。因为b可能实际类型可能不是Derived的类型
//Derived* d = static_cast<Derived*>(b);
if(b->type() == "Derived")
{
Derived* d = static_cast<Derived*>(b);
d->print();
}
//如果类中没有虚函数表,则调用dynamic_cast会直接报错,编译不过。
//当父、子类没有继承关系时,dynamic_cast返回false,否则会转换后
//实际对象的地址
cout << dynamic_cast<Derived*>(b) << endl;
}
int main()
{
Base b;
Derived d;
Child c;
test(&b); //Base与Base没有继承关系,dynamic_cast返回false
test(&d); //Derived与Base有继承关系,dynamic_cast转换后对象的地址
test(&c); //Child与Derived没有继承关系,返回false
;
}
/*输出结果:
0
I'm a Derived.
0x23feb8
0
*/
(2)多态解决方案的缺陷
①必须从基类开始提供类型虚函数
②所有的派生类都必须重写类型虚函数
③每个派生类的类型名必须唯一
3. 类型识别关键字:typeid(须#include<typeinfo>)
(1)typeid关键字
①typeid关键字返回对应参数的类型信息
②typeid返回一个type_info类的对象
③当typeid的参数为NULL时抛出异常
(2)typeid关键字的使用
; const type_info& tiv = typeid(i); //得到变量i的类型信息 const type_info& tii = typeid(int); //得到int类型信息
(3)typeid的注意事项
①当参数为类型时:返回静态类型信息
②当参数为变量时:
A.不存在虚函数表时:返回静态类型信息
B.存在虚函数表时:返回动态类型信息
【编程实验】typeid类型识别
#include <iostream>
#include <string>
#include <typeinfo> //for typeid
using namespace std;
class Base
{
public:
virtual ~Base(){}
};
class Derived : public Base
{
public:
void print()
{
cout << "I'm a Derived." << endl;
}
};
void test(Base* b)
{
//const type_info& tb = typeid(b); //判断b的类型,Base*或Derived*
const type_info& tb = typeid(*b); //判断对象的类型
cout << tb.name() << endl;
}
int main()
{
;
const type_info& tiv = typeid(i); //判断变量的类型
const type_info& tii = typeid(int); //判断类的类型
cout << (tiv == tii) << endl; //相等
Base b;
Derived d;
test(&b);
test(&d);
;
}
/*输出结果:
1
4Base //g++下类名前面的数字表示类名的长度
7Derived
*/
4. 小结
(1)C++中有静态类型和动态类型的概念
(2)利用多态能够实现对象的动态类型识别
(3)typeid是专用于类型识别的关键字
(4)typeid能够返回对象的动态类型信息
第66课 C++中的类型识别的更多相关文章
- JS中的类型识别
JS为弱类型语言,所以类型识别对JS而言尤为重要,JS中常用的类型识别方法有4种:typeof.Object.prototype.toString.constructor和instanceof. (1 ...
- C++中的类型识别
1,为什么会提出类型识别概念呢? 1,为什么在 C 语言中没有提出这个概念呢,就是因为在 C++ 中引入了面向对象的特性,面向对象里面有一个非常重要的原则就是赋值兼容性原则: 2,在面向对象中可能出现 ...
- 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...
- 关于js中的类型内容总结(类型识别)
JS 有7种数据类型: 6种原始类型:Boollean String Number Null Underfined Symbol 引用类型:Object 类型识别主要有以下四 ...
- C++之运行时类型识别RTTI
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- RTTI 运行时类型识别 及异常处理
RTTI 运行时类型识别 typeid ------ dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
- Scala 深入浅出实战经典 第49课 Scala中Variance代码实战(协变)
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 数据库中字段类型对应的C#中的数据类型
数据库中字段类型对应C#中的数据类型: 数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] ...
随机推荐
- 【小贴士】虚拟键盘与fixed带给移动端的痛!
前言 今天来公司的主要目的就是研究虚拟键盘与fixed的问题,期间因为同事问起闭包与事件委托(阻止冒泡)相关问题,便穿插了一篇别的: [小贴士]工作中的”闭包“与事件委托的”阻止冒泡“,有兴趣的朋友可 ...
- JEPF 3.1.2 发布,我们的软件机床(软件快速开发平台)
JEPF新一代软件快速开发平台(Java Elephant Platform)是一款优秀的平台产品,它本着灵活.快捷开发.高性能.高协作性.高稳定性.高可用性.人性化的操作体验为设计宗旨历经2年研发成 ...
- SharePoint 2013 内容部署报错
错误信息 一 Export ran out of memory while compressing a very large file. To successfully export, turn co ...
- Office 365 - SharePoint 2013 Online 中使用Windows PowerShell
1.如果想要在SharePoint Online中使用Windows PowerShell,首先需要安装SharePoint Online Management Shell(下载地址附后),如下图: ...
- 如何保护在Autodesk应用程序商店的应用不被盗版 - 1
Autodesk应用程序商店如火如荼,但来自中国的应用却还是寥寥无几.大家在担心什么呢?可能其中一个因素就是担心自己的应用上线后被盗版的问题.对应用的版权保护和授权管理是每个应用开发者都应该认真考虑的 ...
- Java输入/输出流体系
在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...
- Android 的系统架构
Android 的系统架构 Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所 ...
- Android简单的ListViewDemo及每个控件的点击事件
ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...
- DIV+CSS实现左侧带三角形的提示框
实现效果
- CentOS添加新硬盘到新的分区(xfs/ext4) 或者添加新分区
CentOs添加新硬盘到新的分区(xfs/ext4) 添加新分区 转载请注明:http://www.cnblogs.com/juandx/p/5618162.html 这篇文章介绍怎么添加一块新的硬 ...