#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;
}

RTTI之dynamic_cast运算符  

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

相关文章:

  • 2022-02-28
  • 2021-08-21
  • 2021-10-07
  • 2021-11-05
  • 2021-10-10
  • 2021-07-31
  • 2022-12-23
  • 2021-11-23
猜你喜欢
  • 2021-10-12
  • 2021-12-22
  • 2021-06-27
  • 2021-10-01
相关资源
相似解决方案