gpt4 book ai didi

c++ - 将指向基类的指针转换为指向派生类的指针

转载 作者:太空狗 更新时间:2023-10-29 20:00:01 31 4
gpt4 key购买 nike

我已经阅读了一些关于 C++ 中的转换的内容。来自 C 背景,使用普通的 (type) 转换对于 void * 之类的东西很常见,但对于 C++,有 dynamic_castreinterpret_cast, static_cast

问题/问题/问题是关于在基指针和派生指针之间进行转换时应使用上述哪种类型转换。

我们的数据存储存储指向基类 (B) 的指针。这些函数分配派生指针 (D)。

代码示例如下:

class B
{ int _some_data; }
class D : public B
{ int _some_more_data; }

代码看起来像这样:

D *obj = new D;
obj->_some_data = 1;
obj->_some_more_data = 2;
<store obj>

然后当我们访问数据时:

B *objB = <get out data>
if (objB->_some_data == 1)
{ D *objD = (D *) objB; <do some processing> }

现在我关心的转换是 D *objD = (D *) objB

我们应该使用哪种转换?

谢谢。

最佳答案

在这种情况下,没有 Actor 是真正安全的。

最安全的是dynamic_cast,但您的对象不是多态的,因此它不适用于此处。但是您至少应该考虑拥有一个虚拟析构函数,因为我看到您计划扩展这些类。

static_cast 不安全,正如 msdn 所指出的那样页:

class B {};

class D : public B {};

void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // not safe, pb may
// point to just B

B* pb2 = static_cast<B*>(pd); // safe conversion
}

reinterpret_cast 也没有检查,所以不要依赖它。

此外,转换为派生类的指针至少是一种代码味道,如果您需要这样做,99% 可以确定您的设计存在缺陷。

关于c++ - 将指向基类的指针转换为指向派生类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9374244/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com