我只是从基类创建了两个派生类。然后创建一个派生类的对象并转换为基类。然后从基类转换为第二个派生类,我希望它不会起作用,但确实可以。有人可以解释一下下面的代码如何工作吗?如何防止这种情况发生呢?
#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;
}
关于,Hemant Kapoor
您不能,这是与static_cast
签订的合同的一部分。它在编译时已解决,因此不会在运行时检查您是否输入了错误:转换为错误的类型只会触发UB。
[如果需要运行时检查的转换,请使用dynamic_cast
。