【问题标题】:Casting pointer to pointer in a type-safe manner以类型安全的方式将指针转换为指针
【发布时间】:2017-06-02 22:17:46
【问题描述】:

给定以下代码:

class Base
{
public:
   virtual ~Base() = default;
};

class Derived : public Base { };

int main(void)
{
  Derived d;
  Base* pb = &d;
  Base** ppb = &pb;

  Derived** ppd = ...; // Can this be defined in a type-safe manner?

  return 0;
}

是否可以在不引入Derived* 类型的中间变量的情况下为分配给ppd 提供类型安全的表达式?

【问题讨论】:

  • 没有Dervied* 对象可以指向ppd。你首先得介绍一个。在你问之前,pb 不是。
  • @IgorTandetnik 我已经更新了这个问题,所以很明显这个想法不是要引入 ppd 的对象来指向。
  • T* 类型的有效指针要么为空,要么指向 T 类型的对象。由于您在程序中的任何地方都没有Derived* 类型的对象,也不愿意引入一个对象,所以ppd 只能为空。我认为Derived** ppd = nullptr; 不是您想要的答案。
  • 没有。 Derived ** 不是 Base **。无论您是否引入中间变量,任何从一个到另一个的转换都不是类型安全的。
  • @IgorTandetnik,谢谢。我喜欢nullptr 解决方案 :) 但确实不是我要找的那个。

标签: c++ pointers


【解决方案1】:

AFAIK,不是没有声明一个指向 dDerived 指针。指向d (pb) 的Base 指针已经通过抽象丢失了类型信息,如果没有不安全的强制转换,就无法恢复。

由于您要声明一个指向Derived 的指针,因此首先需要一个指向Derived 的指针。例如:

Derived* pd = &d;
Derived** ppd = &pd;

这两个定义都是类型安全的,在编译时检查。

【讨论】:

    【解决方案2】:

    是否可以在不引入Derived* 类型的中间变量的情况下为ppd 的赋值提供一个类型安全的表达式?

    好吧,显然有一个安全的选择:

    Derived** ppd = nullptr;
    

    否则:不可以。Derived** 可以安全指向的唯一对象是 Derived*。您没有Derived* 对象,也没有兴趣介绍一个对象,因此您不能指向一个对象。

    请注意,Base*不是Derived* 的基数,因此Base**Derived** 之间没有像Base*Derived* 之间的多态关系。

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多