c++ - 将第一个派生类转换为第二个派生类 - 为什么会起作用?
问题描述
我只是从一个基类创建了两个派生类。然后创建派生类的对象并转换为基类。然后从基类,我转换为第二个派生类,我希望它不起作用,但它确实起作用了。有人可以解释一下下面的代码是如何工作的......以及如何防止这种情况发生......
PS:现在编辑程序以使其更有意义。如果可能的话,这也是我想避免的情况:
class Animal
{
public:
Animal() { std::cout << "I am an animal\r\n"; };
virtual void makeSound() = 0;
~Animal() = default;
};
class Cat : public Animal
{
public:
Cat() { std::cout << "I am a Cat\r\n"; };
void makeSound() final { std::cout << "Meaow\r\n"; }
~Cat() = default;
};
class Dog : public Animal
{
public:
Dog() { std::cout << "I am a Dog\r\n"; };
void makeSound() final { std::cout << "Bark\r\n"; }
~Dog() = 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;
}
int main()
{
auto cat = std::make_unique<Cat>();
auto base = dynamicConvert<Cat, Animal>(std::move(cat));
base->makeSound();
auto dog = dynamicConvert<Animal, Dog>(std::move(base));
dog->makeSound();
return 0;
}
输出:
I am an animal
I am a Cat
Meaow
Bark
解决方案
你不能,这是与static_cast
. 它在编译时解决,因此不会在运行时检查您没有犯错:转换为错误的类型只会触发 UB。
dynamic_cast
当您需要运行时检查的转换时使用。
推荐阅读
- apache - 未在运行状况检查请求中设置 SNI 扩展 (Apache v.2.4.35)
- python - sqlalchemy 的闭幕式
- python - 对一位数和两位数的混合进行排序
- angular - 每次 HttpClient 调用时,Angular 6 都将 withCredentials 设置为 true
- javascript - 对象中的嵌套数组如何发生不变性
- mysql - Mysql插值
- r - ggplot饼图来自单列中的因子
- python - 为 Pandas DataFrame 创建计算列的有效方法
- javascript - 如何在 Electron 和 React 应用程序中的 componentDidMount() 中接收状态的更改值
- php - 测试返回比预期更多的断言