Object与RTTI

1.定义

结合前面的内容,可以定义如下的基类

 1 class Object : public Memory
 2 {
 3     DECL_TPLT(Object);
 4     DECL_RTTI(Object);
 5 public:
 6     bool        isKindOf(me::Type type) const
 7     {
 8         return getType().isKindOf(type);
 9     }
10     bool        isExactKindOf(me::Type type) const
11     {
12         return getType().isExactKindOf(type);
13     }
14     const char*    getTypeName()const
15     {
16         return getType().getName();
17     }
18 };

定义继承类型

class DerivedObject : public me::Object
{
    DECL_TPLT(DerivedObject);
    DECL_RTTI(DerivedObject, Object);
};
template <typename T>
class TemplateObject : public DerivedObject
{
    DECL_TPLT(TemplateObject, T);
    DECL_RTTI(TemplateObject, DerivedObject);
};

2.使用

 1     DerivedObject* pdo1 = new DerivedObject();
 2     Object* po1 = pdo1->getType().newObject();
 3     if (pdo1->getType() == pdo1->getType()) {
 4         std::cout << "po1 is an instance of " << po1->getType().getName() << std::endl;
 5         DerivedObject* pdo2 = static_cast<DerivedObject*>(po1);
 6     }
 7     typedef TemplateObject<Object*> TObject;
 8     Type tobj = TObject::TypeId;
 9     std::cout << tobj.getName() << ":" << tobj.getHash() << std::endl;
10     Type btdobj = tobj.getBaseTypes()[0];
11     std::cout << btdobj.getName() << ":" << btdobj.getHash() << std::endl;
12     Type tbase = Object::TypeId;
13     if (tobj.isKindOf(tbase)) {
14         std::cout << tobj.getName() << " is kind of " << tbase.getName();
15     }
16     delete pdo1;

3.结果

时间: 2024-12-15 06:54:14

Object与RTTI的相关文章

Getting Text Metrics in Firemonkey(delphiscience的博客)

Firemonkey’s abstract TCanvas class has been providing the dimensions of the bounding rectangle of some text on itself. On recent updates it has deprecated providing text rectangle directly in the canvas, in stead encouraged users to use TTextLayout

c++ cast operator(类型转换操作符)

复制于:http://xiaochonganty.blog.163.com/blog/static/48527932008931104132748/ New Cast Operators Originally, the C++ standardization committee wanted to deprecate C-style casting, thereby enforcing the use of the new cast operators exclusively. However,

java 向下转型

向下转型参照下面两示例,编译错误IDE会报错 package object; import java.lang.*; import java.util.*; class Cycle{ public int ride(Cycle i) { return i.wheel(); } public int wheel() { return 0; } } class Uncicycle extends Cycle{ public int wheel() { return 1; } public void

Concurrent.Thread.js

(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( this.Data.Stack === undefined ) this.Data.Stack = undefined; with ( function(){ with ( Data ) { return function () {

C++的 RTTI 观念和用途(非常详细)

自从1993年Bjarne Stroustrup [注1 ]提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI:最近新推出的C++ 或多或少已提供RTTI. 然而,若不小心使用RTTI,可能会导致软件弹性的降低.本文将介绍RTTI的观念和近况﹐并说明如何善用它. 什么是RTTI﹖      在C++ 环境中﹐头文件(header file) 含有类之定义(class definition)亦即包含有关类的结构资料(representat

java的RTTI和反射机制

RTTI,即Run-Time Type Identification,运行时类型识别.它假定我们在编译时已经知道了所有的类型.那么在运行时就能够自动识别每个类型. 很多时候需要进行向上转型,比如Base类派生出Derived类,但是现有的方法只需要将Base对象作为参数,实际传入的则是其派生类的引用.那么RTTI就在此时起到了作用,比如通过RTTI能识别出Derive类是Base的派生类,这样就能够向上转型为Derived.类似的,在用接口作为参数时,向上转型更为常用,RTTI此时能够判断是否可

Java系列笔记(2) - Java RTTI和反射机制

目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). 在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本文主要讲反射方式实现的RTTI,建议在阅读本文之前,先了解类的加载机制(

【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)

前言中的内容: 1.什么是C++对象模型? 1.语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 2. C++ class的完整virtual functions在编译时期就固定下来了,程序员没有办法再执行器动态增加或取代其中一个.这使得虚拟调用操作得以快速地派送结果,付出的成本则是执行期的弹性. 3. 全局对象在main()函数之前便完成初始化. 第一章 关于对象 1. 在C++中,有两种class data members:static 和 nonstatic,以及三种

RTTI

RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. 编辑本段RTTI介绍 RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型: (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用. 面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背景知