lundi 7 octobre 2019

C++ Convert one derived class to another... How is it working?

I simply created two derived class from a base class. Then created an object of a derived class and converted into base class. Then from the base class, i converted to derived class number two, I was hoping it won't work, but it did. Can someone please explain me how below code is working... And How do I prevent this from happening...

#include <iostream>
#include <memory>


class BaseClass
{
public:
    BaseClass() { std::cout << "This is base class\r\n";  };
    ~BaseClass() = default;
};

class DerivedClass : public BaseClass
{
public:
    DerivedClass() { std::cout << "This is Derived class\r\n"; };
    void print() { std::cout << "Print from Derived class\r\n"; };
    ~DerivedClass() = default;
};

class DerivedClass2 : public BaseClass
{
public:
    DerivedClass2() { std::cout << "This is Derived 2 class\r\n"; };
    void print123() { std::cout << "Print from Derived  2class\r\n"; };
    ~DerivedClass2() = default;
};

template<typename baseType, typename derivedType>
std::unique_ptr<derivedType> dynamicConvert(std::unique_ptr<baseType> baseObj)
{
    auto tmp = dynamic_cast<derivedType*>(baseObj.get());
    std::unique_ptr<derivedType> derivedPointer;
    if (tmp != nullptr)
    {
        baseObj.release();
        derivedPointer.reset(tmp);
    }
    return derivedPointer;
}

template<typename baseType, typename derivedType>
std::unique_ptr<derivedType> staticConvert(std::unique_ptr<baseType> baseObj)
{
    auto tmp = static_cast<derivedType*>(baseObj.get());
    std::unique_ptr<derivedType> derivedPointer;
    if (tmp != nullptr)
    {
        baseObj.release();
        derivedPointer.reset(tmp);
    }
    return derivedPointer;
}


int main()
{
    auto derived = std::make_unique<DerivedClass2>();
    auto base = dynamicConvert<DerivedClass2, BaseClass>(std::move(derived));
    auto derived1 = staticConvert<BaseClass, DerivedClass>(std::move(base));
    derived1->print();
    return 0;
}

Regards, Hemant Kapoor

Aucun commentaire:

Enregistrer un commentaire