#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! ";} 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! ";} virtual void Say() const { cout << "I hold the superb value of " << Value() << "! "; } }; 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!!! ";} void Say() const {cout << "I hold the character " << ch << " and th e integer " << Value() << "! ";} }; 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 *?如果可以,运算符将返回对象的地址,否则返回一个空指针。