RTTI之dynamic_cast运算符

#include <iostream>
#include <cstdlib>
#include <ctime>

using std::cout;
class Grand
{
	private:
		int hold;
	public:
		Grand(int h=0):hold(h){}
		virtual void Speak() const {cout << "I am a grand class!\n";}
		virtual int Value() const {return hold;}
};

class Superb:public Grand
{
	public:
		Superb(int h=0):Grand(h){}
		void Speak() const {cout << "I am a superb class!\n";}
		virtual void Say() const
		{
			cout << "I hold the superb value of " << Value() << "!\n";
		}
};

class Magnificent:public Superb
{
	private:
		char ch;
	public:
		Magnificent(int h=0, char c=‘A‘) : Superb(h),ch(c){}
		void Speak() const {cout << "I am a magnificent class!!!\n";}
		void Say() const {cout << "I hold the character " << ch << " and th e integer " << Value() << "!\n";}
};

Grand * Getone();

int main()
{
	std::srand(std::time(0));
	Grand * pg;
	Superb * ps;
	for(int i=0;i<5;i++)
	{
		pg=Getone();
		pg->Speak();
		if(ps=dynamic_cast<Superb *>(pg))
			ps->Say();
	}
	return 0;
}

Grand * Getone()
{
	Grand * p;
	switch(std::rand()%3)
	{
		case 0: p=new Grand(std::rand()%100);
				break;
		case 1:p=new Superb(std::rand()%100);
			   break;
		case 2:p=new Magnificent(std::rand()%100,‘A‘+std::rand()%26);
			   break;
	}
	return p;
}

  

Superb * pm=dynamic_cast<Superb *>(pg)提出了这样的问题:指针pg的类型是否可被安全地转换为Superb *?如果可以,运算符将返回对象的地址,否则返回一个空指针。

RTTI之dynamic_cast运算符

时间: 2024-07-30 10:20:17

RTTI之dynamic_cast运算符的相关文章

RTTI之typeid运算符

1 #include <iostream> 2 #include <cstdlib> 3 #include <ctime> 4 #include <typeinfo> 5 6 using std::cout; 7 class Grand 8 { 9 private: 10 int hold; 11 public: 12 Grand(int h=0):hold(h){} 13 virtual void Speak() const {cout <<

C++标准转换运算符dynamic_cast

dynamic_cast <new_type> (expression) dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的转换方式来替代.但是也因此它是最常用,最不可缺少的一个运算符. 与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系. 更准确的说,dynamic_cast是用来检查两者是否有继承关系.因此该运算符实

c++中RTTI

RTTI 是"Runtime Type Information"的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI:本文还将详细描述两个重要的 RTTI 运算符的使用方法,它们是 typeid 和 dynamic_cast.如何确定对象的动态类型呢?答案是使用内建的 RTTI 中的运算符:typeid 和 dynamic_cast. typeid的

c++ RTTI

RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. c++有三个支持RTTI的元素 1)如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符返回0 --空指针. dynamic_cast < Type *> (pt); 通常,如果指向对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则上述表达式将指针pt转换为

RTTI

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

RTTI(运行时类型识别)

运行时类型识别(Run-time type identification , RTTI),是指在只有一个指向基类的指针或引用时,确定所指对象的准确类型的操作.其常被说成是C++的四大扩展之一(其他三个为异常.模板和名字空间). 使用RTTI的两种方法: 1.typeid() 第一种就像sizeof(),它看上像一个函数,但实际上它是由编译器实现的.typeid()带有一个参数,它可以是一个对象引用或指针,返回全局typeinfo类的常量对象的一个引用.可以用运算符“= =”和“!=”来互相比较这

C++对象模型之RTTI的实现原理

RTTI是Runtime Type Identification的缩写,意思是运行时类型识别.C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型.但是现在RTTI的类型识别已经不限于此了,它还能通过typeid操作符识别出所有的基本类型(int,指针等)的变量对应的类型. C++通过以下的两个操作提供RTTI: (1)typeid运算符,该运算符返回其表达式或类型名的实际类型. (2)dynamic_cast运算符,该运算符将基类的指针或引用安全地

c++ RTTI(runtime type info)

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

从RTTI谈C++的向下转型

1.什么是RTTI? RTTI 是"Runtime Type Information"的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.允许"用指向基类的指针或引用来操纵对象"的程序能够获取到"这些指针或引用所指对象"的实际派生类型.在 c++中,为了支持 RTTI 提供了两个操作符 : 1 dynamic_cast 操作符:它允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转换类型(安全的向下转型).把基类指针