linux c++ 不能识别类名,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(b);//危险的转换方式,如果b指针指向的子类对象,那就是完全可以的。

}

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

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

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

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

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

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

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

例:

#include

#include

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(b);

c->print();

}

}

int main(void)

{

Base b;

child c;

test(&b);

test(&c);

return 0;

}

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

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

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

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

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

@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

#include

#include

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值