为什么这不是dynamic_cast?

时间:2013-12-11 21:32:10

标签: c++

我正在尝试了解一些C ++功能并编写了一些测试。但是,当我尝试编译时,我收到以下错误(如下)。为什么会发生这种情况,以及正确的方法是什么?我正在尝试将32位指针转换为8位指针,并在转换后打印出内容。

  

cast3.cpp:22:错误:不能用dynamic_cast'bigptr'('uint32_t *'类型)来输入'uint8_t *'(目标不是指针或对类的引用)

代码:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void castme(uint8_t small[], int size);

int main(void)
{
    uint8_t *small;

    uint32_t big = 0x01234567;
    uint32_t *bigptr = &big;

    small = dynamic_cast<uint8_t *>(bigptr); // Line 22
    castme(small, sizeof(big));

    return 0;
}

void castme(uint8_t small[], int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("0x%x\n",  small[i]);
    }
}

4 个答案:

答案 0 :(得分:6)

dynamic_cast仅适用于具有虚拟成员函数的类。要在彼此之间转换原始指针类型,您需要reinterpret_cast

答案 1 :(得分:3)

您正在使用错误的演员。 dynamic_cast仅适用于多态类类型,因为它在运行时执行RTTI查找。您没有在代码中使用多态类类型。要简单地将一个指针类型视为另一个指针类型,您需要使用reinterpret_cast代替:

small = reinterpret_cast<uint8_t *>(bigptr);

答案 2 :(得分:1)

要编译代码,您可以执行以下操作:

small = reinterpret_cast<uint8_t *>(bigptr);

但是我不会这样做,你应该取消引用uint32_t指针然后转换为你想要的类型 - 在我的脑海里没有任何关注uint8_t指针。

即。

uint8_t small_one = *bigptr;

答案 3 :(得分:0)

使用reinterpret_cast。 dynamic_cast有不同的目的。