【发布时间】:2016-03-01 17:33:21
【问题描述】:
使用类B 和派生类D:
class B {
int b;
};
class D : public B {
int d;
};
D* d = new D();
B* b = dynamic_cast<B*>(d);
上面的方法可以正常工作——这是一个简单的向上转换。我们确信b 所指向的任何东西都包含B 类(子)对象。
然而,
B* b = new D();
D* d = dynamic_cast<D*>(b);
即使b 指向一个有效的D 实例,也不会编译——因为基类不是多态的。因此,只需添加一个空虚方法即可解决问题。
重要的问题是为什么 C++ 要求源类型是多态的?我发现的唯一解释是this,但它只是说“因为它是在内部实现的”——至少在我看来)。设计dynamic_cast 的人可能还有其他一些原因——那些是什么?
【问题讨论】:
-
我没有看到任何动态多态的东西。您在基类中至少缺少一个
virtual析构函数。 -
在发布充满错误的代码之前,请使用编译器。
-
@DieterLücking 确实如此,但确切的代码不是这里的重要部分。我想说,这足以证明意图。
标签: c++ polymorphism dynamic-cast