【发布时间】:2014-04-19 06:49:03
【问题描述】:
我想从 void 指针调用派生类中的重写方法。这在运行时失败,因为调用了虚拟 Base::foo() 方法,而不是 Derived::foo()。这就是相关代码的工作方式:
Class Base
{
public:
Base();
virtual void foo() = 0;
}
Class Derived: public Base
{
public:
Derived();
void foo();
}
int main()
{
Derived* dv = new Derived();
void* ptr = dv;
static_cast<Base*>(ptr)->foo();
}
【问题讨论】:
-
对我来说很好(调用派生方法)。但是我相信您尝试做的实际上是未定义的行为,因为标准似乎不能保证如果您将
Derived*转换为void*然后再转换为Base*它实际上会指向正确的对象。 -
例如,允许编译器将
Base子对象放在Derived对象的末尾而不是开头,在这种情况下static_cast<Base*>(ptr)可能不会指向Base子对象,因为它将指向Derived对象的开始。
标签: c++ inheritance void-pointers