如何使用dynamic_cast

时间:2019-04-21 08:01:54

标签: c++ casting

我正在尝试使用dynamic_cast-没有成功。我有一个BASE类,以及一个从BASE派生的类A。我想要一个指向BASE类对象的指针,该对象以后又要转换为A类。我显然没有正确执行此操作。编译以下代码:

#include <cstdio>

class BASE {
private:

    int i;

public:

     BASE(void) {i = 1; }
     virtual ~BASE(){}

     virtual void id() { printf("CLASS BASE\n"); }
 };

class A : public BASE {
public:
    A(void): BASE() {}
    A(const BASE & base) : BASE(base) {}
    A& operator = (const BASE & base) { static_cast<BASE&>(*this) = base; return *this; }

    void id() override { printf("CLASS A\n"); };
};


int main() {

    BASE* base = new BASE();

    base->id();

    A* a = new A(*base);

    a->id();

    A* anotherA = dynamic_cast<A*>(base);

    if(!anotherA) 
        printf("anotherA is NULL\n");
    else    
        anotherA->id();
}

但是运行它会得到:

CLASS BASE
CLASS A
anotherA is NULL

我确信我缺少一些非常基本的东西,但是我一直盯着代码,看不到我在做什么错。任何帮助将不胜感激。

我看过

When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

但是不明白为什么dynamic_cast不起作用-这不只是一个简单的垂头丧气吗?

1 个答案:

答案 0 :(得分:5)

  

我确定我缺少一些非常基本的东西

是的。

当您拥有类型为A对象和该类型为A*的对象的 pointer 时, pointer < / em>可以转换为类型BASE*。这种转换部分忘记了有关该类型的信息。

现在给定类型为BASE*的指针, if 该指针实际上指向一个A对象(也就是说,它是从类型为A*的对象转换为某个点),您可以通过将指针变回类型A*调用被忘记的类型信息。

如果您的指针最初没有指向类型为A的对象,那么就不会忘记任何内容,也没有什么可回忆的。