2017-06-02 65 views
4

鉴于下面的代码段指针:铸造指针在一个类型安全的方式

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类型安全表达,而不引入类型的中间变量Derived*

+0

没有'ppd'指向的'Dervied *'对象。你首先必须介绍一个。在你问之前,'pb'不是。 –

+0

@IgorTandetnik我已经更新了这个问题,所以很明显这个想法并不是要引入一个'ppd'的对象来指向。 –

+1

“T *'类型的有效指针可以是null,也可以指向”T“类型的对象。由于你的程序中没有任何类型的Derived *对象,你也不想介绍它,所以'ppd'只能为null。我假设'派生** ppd = nullptr;'不完全是你正在寻找的答案。 –

回答

3

AFAIK,并非没有声明Derived指向d的指针。 Base指向dpb)的指针已经通过抽象丢失了类型信息,如果没有不安全的强制转换,则无法恢复。

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

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

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

1

是否可以给类型安全的表达赋予ppd,而不引入中介变量Derived*

嘛,有明显的安全选项:

Derived** ppd = nullptr; 

否则:号的唯一对象,一个Derived**可以安全地指向就是Derived*。您没有Derived*对象,您也不想介绍其中的一个,因此您无法指出其中一个。

注意Base*Derived*基部,所以Base**Derived**之间没有关系多态性等有Base*Derived*之间。