2017-06-02 61 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*之間。