| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | // rtti2.cpp  -- using dynamic_cast, typeid, and type_info#include <iostream>#include <cstdlib>#include <ctime>#include <typeinfo>using namespace std;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 cv = 'A') : Superb(h), ch(cv) {}    void Speak() const {cout << "I am a magnificent class!!!\n";}    void Say() const {cout << "I hold the character " << ch <<               " and the integer "  << Value() << "!\n"; }};Grand * GetOne();int main(){    srand(time(0));    Grand * pg;    Superb * ps;    for (int i = 0; i < 5; i++)    {        pg = GetOne();        cout << "Now processing type " << typeid(*pg).name() << ".\n";        pg->Speak();        if( ps = dynamic_cast<Superb *>(pg))            ps->Say();        if (typeid(Magnificent) == typeid(*pg))            cout << "Yes, you're really magnificent.\n";    }    // std::cin.get();    return 0;}Grand * GetOne(){    Grand * p;    switch( rand() % 3)    {        case 0: p = new Grand(rand() % 100);                    break;        case 1: p = new Superb(rand() % 100);                    break;        case 2: p = new Magnificent(rand() % 100, 'A' + rand() % 26);                    break;    }    return p; }
 |