2012-04-26 5 views
2

派生した仮想関数を呼び出すために基本クラスオブジェクトを参照する必要があるのはなぜですか? コピーによってOBJ3派生した仮想関数を呼び出すために、基本クラスオブジェクトを参照する必要があるのはなぜですか?

#include<iostream> 
    using namespace std; 

    class A { 

    public: 
     virtual void print() { cout << "Hello 1" << endl; } 

    }; 

    class B : public A { 

    public: 
     int x; 
     void print() { cout << "Hello " << x << endl; } 

    }; 

    void main(){ 

     B obj1; 
     A &obj2 = obj1; 
     A obj3 = obj1; // Why it is different from obj2 

     obj1.x = 2; 

     obj1.print(); 
     obj2.print(); 
     obj3.print(); // ? 

    } 
+0

多型は参照とポインタに対してのみ機能するためです。 – Mahesh

+0

「XはYを必要とするのはなぜですか?」 「YはXの要件ですから」非常に有用なコメントではありません –

答えて

2
A obj3 = obj1; // Why it is different from obj2 

構築します。この場合、obj1はA型にアップキャストされ、obj3はobj1の「A」パラメータから構築される。この現象はslicingとして知られています。

A &obj2 = obj1; 

この行は、参照obj2をobj1のインスタンスにバインドします。 obj1を "A"にアップキャストしました。これにobj2を指定します。 C++では、リファレンスは単なるエイリアスです。その名前が基本クラス型にバインドされている場合、obj1に別の名前を与えたばかりです。

したがってA obj3は、新しいオブジェクトをスタックに割り当てて構築しますが、A &obj2はすでに存在する他のものの参照/エイリアスを作成するだけです。

+0

分割またはスライス。 – Mahesh

+0

@Maheshありがとうthats私が意味するもの。 –

5

派生オブジェクトを基本変数に割り当てると、基本クラスのインスタンスに "sliced"が取得されます。それはもはや導出されたもののインスタンスではありません。基本変数には基本クラスのインスタンス用に予約された十分な領域しかないので必要です。その追加データを含む派生クラスのインスタンスは適合しません。

参照を使用する場合、オブジェクトを小さな領域にコピーする必要はないため、スライスは行われません。

関連する問題