2017-04-23 16 views
0

キャストダウン中に静的にキャストすると、オブジェクトのスライスにつながりますか?以下のように。C++でのキャスト中のオブジェクトのスライス

class Parent{ // base class 
public: 
    virtual void draw(); 
}; 

class Child: public Parent{ //derived class 
public: 
    void draw() 
    { 
     static_cast<Parent>(*this).draw(); 
     // do other stuff 
    } 
}; 
+1

あなたは' dynamic_castを(これ)をお探しですか?この場合、[非仮想インターフェイスイディオム](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface)(Effective C++のItem 34も同様)を適用することができます。 –

+0

暗黙のアップキャスト(Parent :: draw())を実行すると、問題が解決しました。 –

+2

暗黙のアップキャストではなく、どんな種類のキャストでもありません。あなたはそれを完全修飾名で呼ぶだけです。 – StoryTeller

答えて

1

あなたのダウンキャスティングではなく、あなたのアップキャスト(並べ替え)です。

static_cast<Parent>(*this)Parentという新しいテンポラリを作成するので、スライシングするのは*thisです。

[expr.static.cast/1]

発現はstatic_castの結果(V)入力する式Vを変換した結果である:C++標準当たりとして

Parent{*this}.draw(); 

:これは、次のと本質的に同等ですTが、左辺値の参照型または右辺値の関数型への参照である場合、結果は左辺値です。 Tがオブジェクト型への参照値である場合、結果はxvalueです。 の場合、結果はprvalueになります。 static_cast演算子はconstをキャストしてはならない。

[basic.lval/1.2] ...

  • prvalueは、その評価オブジェクトまたはビットフィールドを初期化式である、またはオペレータのオペランドの値を計算しますそれが現れる文脈によって指定されるように。 > `)(ドロー -

...

関連する問題