Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以类型安全的方式将指针强制转换为指针_C++_Pointers - Fatal编程技术网

C++ 以类型安全的方式将指针强制转换为指针

C++ 以类型安全的方式将指针强制转换为指针,c++,pointers,C++,Pointers,给出以下代码: 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? retur

给出以下代码:

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;
}
是否可以为
ppd
的赋值提供一个类型安全的表达式,而不引入
派生*
类型的中间变量

是否可以为
ppd
的赋值提供一个类型安全的表达式,而不引入
派生*
类型的中间变量

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

Derived** ppd = nullptr;
否则:否。
派生**
可以安全指向的唯一对象是
派生*
。您没有
派生的*
对象,也不想引入一个,因此无法指向一个


请注意,
Base*
不是
Derived*
的基,因此
Base**
Derived**
之间没有多态关系,就像
Base*
Derived*
之间一样,必须声明指向
d
Derived
指针。指向
d
pb
)的
Base
指针已经通过抽象丢失了类型信息,如果没有不安全的强制转换,这些信息将无法恢复

由于要声明指向
派生的
的指针,因此首先需要指向
派生的
的指针。例如:

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

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

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