我想从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();
}
答案 0 :(得分:3)
除了运气之外,除此之外别无选择。由于这是static_cast
,因此必须在编译时知道转换。但是因为指针是void *
,所以编译器无法知道指针需要如何转换为指向派生内部的实例。