我正在尝试使用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不起作用-这不只是一个简单的垂头丧气吗?
答案 0 :(得分:5)
我确定我缺少一些非常基本的东西
是的。
当您拥有类型为A
的对象和该类型为A*
的对象的 pointer 时, pointer < / em>可以转换为类型BASE*
。这种转换部分忘记了有关该类型的信息。
现在给定类型为BASE*
的指针, if 该指针实际上指向一个A
对象(也就是说,它是从类型为A*
的对象转换为某个点),您可以通过将指针变回类型A*
来调用被忘记的类型信息。
如果您的指针最初没有指向类型为A
的对象,那么就不会忘记任何内容,也没有什么可回忆的。