首页 > 代码库 > RTTI之dynamic_cast运算符

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