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