C++ RTTI
来源:互联网 发布:linux 3.0.35 pl2303 编辑:程序博客网 时间:2024/05/16 23:57
C++ runtime type identification。即运行时类型识别
//之所以还要比较类型信息 bool equal(const Base &)函数中
//参数Base转化后的类型可能丢失了一些信息
//比如Base参数是Derived的某个派生类对象,
//Derived对象调用equal函数只会比较Derived类的信息
//而忽略了Base参数含有的额外信息,导致误把两者认为是同一个对象
参考 c++ primer 写的一个小例子,实现的对象的equality operator即等价操作符。如果只使用虚函数实现,那么由于派生类中该比较的函数参数与父类参数相同,应该传递的是一个基类的引用,这样如果传递的是派生类对象,使用该成员函数会把派生类对象转成基类对象,会丢失基类中没有的成员。
#include<iostream>using namespace std;class Base{friend bool operator==(const Base &,const Base&);public:// interface members for BaseBase(int c):color(c){}protected:virtual bool equal(const Base &)const; int color;};class Derived: public Base {friend bool operator==(const Base&, const Base&);public:// other interface members for DerivedDerived(int n,int c):num(n),Base(c){}private:bool equal(const Base&) const;// data and other implementation members of Derived int num;};bool operator==(const Base &lhs, const Base &rhs){return typeid(lhs)==typeid(rhs)&&lhs.equal(rhs);}bool Derived::equal(const Base &rhs) const{if (const Derived *dp=dynamic_cast<const Derived *>(&rhs)){return num==dp->num&&color==dp->color;}elsereturn false;}bool Base::equal(const Base &rhs) const{// do whatever is required to compare to Base objectsreturn color==rhs.color;}int main(){Base b(1);Base *a;Derived d(2,1);Derived c(2,1);a=&c;//print double cout<<typeid(1.56).name()<<endl;//print class Base *cout<<typeid(a).name()<<endl;//print class Derivedcout<<typeid(*a).name()<<endl;if(b==d){cout<<"object b is equal to d"<<endl;}elsecout<<"object b is not equal to d"<<endl;//*a and d is equalif(*a==d){cout<<"the object a points to is equal to d"<<endl;}int i;cin>>i;}
- 【C/C++】RTTI
- ?[C++_10]RTTI
- <C++> RTTI机制
- C++RTTI小总结
- C++RTTI强制转型
- C++RTTI和反射机制
- RTTI
- RTTI
- rtti
- RTTI
- RTTI
- RTTI
- RTTI
- RTTI
- RTTI
- RTTI
- RTTI
- RTTI
- uCOS系统的思考
- 工作学习笔记——4月、5月
- Spring TestContext
- ImageList 、ListView组合显示图片集合
- 编辑格式
- C++ RTTI
- s3c6410硬件WATCHDOG TIMER(看门狗定时器)
- HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
- typedef函数指针的用法
- POJ2352——树状数组的应用
- 【JS--基础--对象】--基础用法(通用的Object属性和方法)
- mp3
- 字符识别(模板匹配&BP神经网络训练)
- Hibernate的学习笔记(2)