【问题标题】:Calling a Derived Class method from a Void Pointer cast to a Base Object从转换为基础对象的 Void 指针调用派生类方法
【发布时间】: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&lt;Base*&gt;(ptr) 可能不会指向Base 子对象,因为它将指向Derived 对象的开始

标签: c++ inheritance void-pointers


【解决方案1】:

除了运气之外,没有其他方法可以工作。由于这是static_cast,因此必须在编译时知道转换。但是因为指针是void *,所以编译器无法知道指针需要如何转换为指向派生内部基类的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多