首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >动态转换空指针有实际用途吗?

动态转换空指针有实际用途吗?
EN

Stack Overflow用户
提问于 2011-11-14 23:22:21
回答 5查看 4.7K关注 0票数 73

在C++中,T q = dynamic_cast<T>(p);构造执行指针p到其他指针类型T的运行时强制转换,这些指针类型必须出现在*p动态类型的继承层次结构中才能成功。这一切都很好。

但是,也可以执行dynamic_cast<void*>(p),它只返回一个指向“派生最多的对象”的指针(参见C++11中的5.2.7::7 )。我知道这个特性在动态类型转换的实现中可能是免费的,但是它在实践中有用吗?毕竟,它的返回类型充其量是void*,那么这有什么好处呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-14 23:48:39

dynamic_cast<void*>()确实可以用来检查身份,即使处理多重继承也是如此。

尝试以下代码:

代码语言:javascript
复制
#include <iostream>

class B {
public:
    virtual ~B() {}
};

class D1 : public B {
};

class D2 : public B {
};

class DD : public D1, public D2 {
};

namespace {
    bool eq(B* b1, B* b2) {
        return b1 == b2;
    }

    bool eqdc(B* b1, B *b2) {
        return dynamic_cast<void*>(b1) == dynamic_cast<void*>(b2);
    }
};

int
main() {
    DD *dd = new DD();
    D1 *d1 = dynamic_cast<D1*>(dd);
    D2 *d2 = dynamic_cast<D2*>(dd);

    std::cout << "eq: " << eq(d1, d2) << ", eqdc: " << eqdc(d1, d2) << "\n";
    return 0;
}

输出:

代码语言:javascript
复制
eq: 0, eqdc: 1
票数 69
EN

Stack Overflow用户

发布于 2011-11-15 00:08:15

请记住,C++允许您使用旧的C方式来做事情。

假设我有一些API,其中我被迫通过类型void*走私一个对象指针,但它最终被传递到的回调将知道它的动态类型:

代码语言:javascript
复制
struct BaseClass {
    typedef void(*callback_type)(void*);
    virtual callback_type get_callback(void) = 0;
    virtual ~BaseClass() {}
};

struct ActualType: BaseClass {
    callback_type get_callback(void) { return my_callback; }

    static void my_callback(void *p) {
        ActualType *self = static_cast<ActualType*>(p);
        ...
    }
};

void register_callback(BaseClass *p) {
   // service.register_listener(p->get_callback(), p); // WRONG!
   service.register_listener(p->get_callback(), dynamic_cast<void*>(p));
}

错误的!代码是错误的,因为它在存在多重继承的情况下会失败(也不能保证在没有多重继承的情况下也能正常工作)。

当然,该应用编程接口不是很像C++风格,如果我继承自ActualType,即使是“正确的”代码也可能出错。所以我不会说这是对dynamic_cast<void*>的一个很好的使用,但它确实是一个使用。

票数 7
EN

Stack Overflow用户

发布于 2011-11-20 16:35:25

当我们将存储放回内存池时,它很有用,但我们只保留一个指向基类的指针。这种情况下,我们应该弄清楚原来的地址。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8123776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档