#include <iostream>
#include <string>
#include <exception>
using namespace std;

class Mom {
    protected:
    int age;
    
    public:
    Mom(int x) : age(x) {}
    virtual void introduce() {
        cout << "I am Mommy. I'm " << age << " years old." << endl;
    }
};

class Daughter : public Mom {
    public:
    string is_daughter = "Yes";
    Daughter(int x) : Mom(x) {}
    virtual void introduce() {
        cout << "I am Daughter. I'm " << age << " years old." << endl;
    }
    
    void boyfriend() {
        cout << "This is a secret: I have a boyfriend." << endl;
    }
    
    string confirm() { return is_daughter; }
};

int main() {
    // dynamic cast
    Mom *m = new Mom(49);
    Daughter *d = new Daughter(16);
    Mom *m2 = new Daughter(23);
    
    Daughter *d2 = dynamic_cast<Daughter*>(m); // dynamic downcast1
    Daughter *d3 = dynamic_cast<Daughter*>(m2); // dynamic downcast2
    Mom *m3 = dynamic_cast<Mom*>(d); // dynamic upcast
    
    cout << d2 << endl; // base* to base -> cast to derived -> cast fail
    cout << d3 << endl; // base* to derived -> cast to derived -> cast success
    cout << m3 << endl;
    
    cout << "result of d3:" << endl;
    try{ // completely casted
        d3->introduce();
        d3->boyfriend();
    } catch(exception& e) {
        cout << e.what() << endl;
    }
    
    cout << "result of m3:" << endl;
    try {
        m3->introduce(); // virtual - call daughter's introduce()
    } catch(exception& e) {
        cout << e.what() << endl;
    }
    
    delete m2;
    delete m;
    delete d;
    return 0;
}

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: