为什么这不会是dynamic_cast

Why will this not dynamic_cast?

本文关键字:dynamic cast 为什么      更新时间:2023-10-16

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

cast3.cpp:22:错误:无法将"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%xn",  small[i]);
    }
}

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

您使用了错误的强制转换。dynamic_cast只适用于多态类类型,因为它在运行时执行RTTI查找。您的代码中没有使用多态类类型。要简单地将一种指针类型视为另一种指针,需要使用reinterpret_cast

small = reinterpret_cast<uint8_t *>(bigptr);

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

small = reinterpret_cast<uint8_t *>(bigptr);

但我不会这么做,你可能应该取消引用uint32_t指针,然后转换成你想要的类型——在我看来,转换成uint8_t指针没有意义。

即。

uint8_t small_one = *bigptr;

使用relpret_cast。dynamic_cast有不同的用途。