#include <iostream>
#include <vector>
#include <functional>

using namespace std;

class Base
{
public:
    int m_i = 0;
    
    virtual void print()
    {
        cout << "I'm Base" << "\n";
    }
};

class Derived1 : public Base
{
public:
    int m_j = 1024;
    
    virtual void print() override
    {
        cout << "I'm derived" << "\n";
    }
};

class Derived2 : public Base
{
public:
    string m_name = "Dr. Two";
    
    virtual void print() override
    {
        cout << "I'm derived" << "\n";
    }
};

int main()
{
    Derived1 d1;
    Base *base = &d1; // m_j는 base에서는 접근 불가능.
    
    auto *base_to_d1 = dynamic_cast<Derived1*>(base);
    cout << base_to_d1->m_j << "\n";
    
    // auto *base_to_d2 = dynamic_cast<Derived2*>(base); // dynamic cast는 실패하면 nullptr을 넣는다. // static_cast는 된다.
    // 따라서 일반적으로 다음과 같은 if문을 추가한다.
    //if (base_to_d2 != nullptr)
    //    cout << base_to_d2->m_name << "\n";
    //else
    //    cout << "Failed" << "\n";
    
    return 0;
}