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
解决方案:),但实际上不是我想要的。