将基类对象强制转换为派生类

Cast base class object to derived class

本文关键字:派生 转换 基类 对象      更新时间:2023-10-16

假设我有两个类,动物和狗。

class Animal
{
};
class Dog : public Animal
{
};

我有一个叫动物的动物对象,它实际上是狗的一个实例,我怎么把它扔回狗?这似乎是一个奇怪的问题,但我需要它,因为我正在编写一个编程语言解释器,并且在堆栈上所有内容都存储为 BaseObject,所有其他数据类型都扩展了 BaseObject。 如何将堆栈中的基本对象强制转换为特定数据类型? 我试过这样的事情

Dog dog = static_cast<Dog>(animal);

但它给了我一个错误

1>------ Build started: Project: StackTests, Configuration: Debug Win32 ------
1>  StackTests.cpp
1>c:usersownerdocumentsvisual studio 2012projectsstacktestsstacktestsstacktests.cpp(173): error C2440: 'static_cast' : cannot convert from 'Animal' to 'Dog'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
1>c:usersownerdocumentsvisual studio 2012projectsstacktestsstacktestsstacktests.cpp(173): error C2512: 'Dog' : no appropriate default constructor available
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

编辑:我决定改用指针。

使用 dynamic_cast:

Animal& animal = getAnimalFromStack();    
if(Dog *d = dynamic_cast<Dog*>(&animal)) 
    {
       // You have a dog pointer, use *d ...
    }