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 *?如果可以,运算符将返回对象的地址,否则返回一个空指针。

posted on 2014-07-20 16:32  lakeone  阅读(232)  评论(0编辑  收藏  举报

导航