2017-06-02 16 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 *'の有効なポインタはヌルであるか、タイプが 'T'のオブジェクトを指しています。 'Derived *'型のオブジェクトをプログラムのどこにも持っておらず、また、導入しようとしないので、 'ppd'はnullにしかなりません。私は 'Derived ** ppd = nullptr; 'と答えていますが、あなたが探していた答えはあまりありません。 –

答えて

3

AFAIK dへのポインタDerivedを宣言することなく、AFAIK。 Basedpb)へのポインタは、抽象化によって型情報を既に失っています。これは、安全でないキャストなしには回復できません。

Derivedへのポインタへのポインタを宣言しているので、最初にDerivedへのポインタが必要です。例:

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

これらの定義はどちらもコンパイル時にチェックされます。

1

ppdへの代入に対してタイプセーフな式を指定することはできますが、Derived*という中間変数を導入する必要はありませんか?

まあ、明らかに安全なオプションがあります:

Derived** ppd = nullptr; 

そうでない場合:いいえ。唯一のオブジェクトDerived**が安全でIS Derived*を指すことができること。あなたはDerived*オブジェクトを持っていないし、それを紹介することにも興味がないので、1つを指すことはできません。 Base*Derived*のベースないので、Base*Derived*の間に存在するようBase**Derived**間には多型の関係が存在しないこと

注意。

関連する問題