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