2016-07-06 19 views
0

の間に違いはありますか?オブジェクトをベースクラスまたは派生クラスにキャストしますか?例は、私は他の上で1つを選択しないする</p> <pre><code>cBase* object = new cDerived(); </code></pre> <p>と</p> <pre><code>cDerived* object = new cDerived(); </code></pre> <p>その場合、:

+0

'CBASE *オブジェクトの違いは何;'と '*オブジェクトをcDerived;'? – immibis

+0

これは私が見つけようとしていることです。 – drum

答えて

4

違いは、結果の多くを持つことができ、異なるタイプを有するものとしてobject宣言することです。たとえば:

  • cDerivedは(それがcBaseから継承ものを超えて)、新しいメンバーを宣言した場合は、その後、cDerived* objectを有する唯一のバージョンが入手可能なもの(バックcDerived*に明示的に意気消沈していない限り)になります。
  • cDerivedがオーバーライドする非仮想メンバ関数を宣言した場合、どの仮想関数が呼び出されるかは、呼び出しに使用するポインタの種類によって異なります。
  • 関数がcDerived*を受け取ると予想される場合は、cDerived*に明示的にダウンキャストしない限り、に渡すことはできません。
2

objectの静的な型は、あなたの二つの例で異なります。のは、例を見てみましょう:

struct A {}; 

struct B : A 
{ 
    void method() {} 
}; 

int main() { 
    A* a = new B; 
    B* b = new B; 
    a->method(); // compile error, A has no member named method. 
    b->method(); // fine. b's static type is B*, and B has a member named method 
} 

aが実際にBオブジェクトを指していることそれが問題ではありません。その静的型はA*であり、Aにはmethodという名前のメンバーはありません。

関連する問題