C++中的类型识别

1、C++中类型识别

(1)在面向对象中可能出现下面的情况

@1:基类指针指向子类对象 Base *p = new child();

@2:基类引用成为子类对象的别名 Base& r = *p;

--上面的base是基类,child是这个基类的子类,第一种情况,由于赋值兼容性的存在,父类指针是可以指向子类对象的,但是我们无法通过父类指针来知道当前指针指向的是否是子类对象。

--但是这时我们可以说,指针p的静态类型是Base*(指针期望的类型),指针p的动态类型是child(因为这时指针p指向的类型不是本身指针p所期望的类型,所以child叫指针p的动态类型)

--第二种情况,Base&是r的静态类型,因为r这个引用期望得到的类型是Base这个父类,但是由于赋值兼容性原则,此时r成为了子类child所在堆空间的别名了,引用本身也没有办法确定引用的到

--底是父类对象还是子类对象。所以child这个类型此时也是引用r的动态类型(因为和r本身想引用的类型不同)。

(2)静态类型:变量(对象)本身的类型叫做静态类型。

(3)动态类型:指针(引用)所指向对象的实际类型。

void test(Base *b)

{

child *d = static_cast<child*>(b); //危险的转换方式,如果b指针指向的子类对象,那就是完全可以的。

}

基类指针是否可以强制类型转换为子类指针取决于动态类型。

2、C++中如何得到对象的动态类型?

(1)解决方案1:利用多态

@1:在基类中定义虚函数返回具体的类型信息(返回字符串,字符串来表示当前的类型信息)

@2:所有的派生类都必须实现类型相关的虚函数

@3:每个类中的类型虚函数都需要不同的实现

@4:我们调用这个类对象的类型虚函数,就可以知道当前类究竟是子类还是父类了。

例:

#include <iostream>

#include <string>

using namespace std;

/*

* 利用多态的方法,进行对象的动态类型识别,也就是区别判断出,当前的父类指针指向的到底是子类对象还是父类对象。

*

*

*/

class Base

{

public:

virtual string type()

{

return "Base";

}

};

class child : public Base

{

public:

virtual string type() //子类重写这个函数,到时用来判断父类指针指向的到底是父类对象还是子类对象的

{

return "child";

}

void print()

{

cout << "I‘m a child. " << endl;

}

};

void test(Base *b)

{

if ( b->type() == "child" )

{

child *c = static_cast<child*>(b);

c->print();

}

}

int main(void)

{

Base b;

child c;

test(&b);

test(&c);

return 0;

}

(2)多态解决方案的缺陷:

@1:必须从基类开始提供类型虚函数

@2:所有的派生类必须重写类型虚函数

@3:每个派生类的名字必须唯一

(3)C++提供了typeid关键字用与获取类型信息,使用时要包含头文件<typeinfo>

@1:typeid关键字返回对应参数的类型信息

@2:typeid返回一个type_info类对象,所以要包含头文件typeinfo

@3:当typeid的参数为NULL时将抛出异常

(4)typeid关键字的使用

int i = 0;

const type_info& tiv = typeid(i);

const type_info& tii = typeid(int);

cout << (tiv == tii) << endl; // 1

(5)typeid的注意事项

@1:当参数为类型时:返回静态类型信息(期望的类型)

@2:当参数为变量时:

不存在虚函数表时:返回静态类型信息

存在虚函数表时:返回动态类型信息(实际对象的类型)

#include <iostream>

#include <string>

#include <typeinfo>

using namespace std;

/*

* 利用typeid,进行对象的动态类型识别,也就是区别判断出,当前的父类指针指向的到底是子类对象还是父类对象。

*

*

*/

class Base

{

public:

virtual ~Base()

{

}

};

class child : public Base

{

public:

};

void test(Base *b)

{

const type_info& tb = typeid(*b);

cout << tb.name() << endl;

}

int main(void)

{

int i = 0;

const type_info& tiv = typeid(i);

const type_info& tii = typeid(int);

cout << (tii == tiv) << endl;

Base b;

child c;

test(&b);

test(&c);

return 0;

}

时间: 2024-08-06 11:55:06

C++中的类型识别的相关文章

第66课 C++中的类型识别

1. 类型识别 (1)在面向对象中可能出现下面的情况 ①基类指针指向子类对象 ②基类引用成为子类对象的别名 ▲静态类型——变量(对象)自身的类型(定义变量类型时类型或参数类型) ▲动态类型——指针(引用)所指向的对象的实际类型 (2)基类指针转子类指针: ①示例:Derived* d = static_cast<Derived*>(pBase); //危险的转换方式 ②问题:不安全,是否能强制类型转换取决动态类型. 2. 利用多态获取动态类型 (1)解决方案 ①在基类中定义虚函数,并返回具体的

JS中的类型识别

JS为弱类型语言,所以类型识别对JS而言尤为重要,JS中常用的类型识别方法有4种:typeof.Object.prototype.toString.constructor和instanceof. (1)typeof可以识别标准类型(Null除外),不能识别具体的对象类型(Function除外),举例如下: 1 console.log(typeof("tom")); //"string" 2 console.log(typeof(12)); //"numbe

JS的四种类型识别方式

前言 JS中包含丰富的类型系统,在使用过程中,类型识别是重要的一环.JS提供了4种通用的类型检测的方法 [typeof][instanceof][constructor][Object.prototype.toString] [typeof] [识别] 1.能够识别基本数据类型(Null会被识别成'object') 2.不能识别具体的引用类型(Function除外) console.log(typeof "jerry");//"string" console.log

MFC中的运行时类型识别(RTTI)

RTTI是Runtime Type Identification的缩写,中文名为"运行时类型识别". MFC早在编译器支持RTTI之前,就有了这种能力.我们现在要以相同的手法,在Console程序中仿真出来.我希望我的类库具备IsKindOf 的能力,能在执行期侦测到某个对象是否属于某个类,并传回TRUE 或 FALSE.以形状 Shape为例 ,我希望: 即 长方形属于"长方形类",正方形属于"长方形类",圆不属于"长方形类"

函数中的类型是怎么工作的

函数中的类型是怎么工作的 理解类型标记 我们已经理解函数了,看看函数中的类型是怎么工作的,还有域和范围.这只是一个概述,这个"understandingF# types"系列会为你详细介绍. 首先,我们应该多理解类型符号一点.我们之后箭头符号用于域和范围,所以它总是像函数签名: val functionName : domain -> range 看这些示例函数 : let intToString x = sprintf "x is %i" x // form

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c

RTTI 运行时类型识别

RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3.转换成功返回的是子类的地址,失败返回NULL typeid注意事项: 1.typeid返回一个type_info对象的引用 2.如果想通过基类获得派生类的数据类型,基类必须带有虚函数 3.只能获取对象的实际类型

类型识别

类型识别: 由于JS属于弱类型脚本语言,在变量赋值过程中,不考虑赋值对象类型,在程序编写过程中可能出现由于编写对象的类型不明确,导致各类诸如调用方法的使用不当等bug,因此需要进行类型识别.有以下几种方法: typeof:可以识别标准类型(Null除外),但不能识别具体的对象类型(function除外) Object.prototype.toString:可以识别标准类型以及内置对象类型,但不能识别自定义类型. function type(obj){ return Object.prototyp

C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert> struct B {} b, c; struct D : B {