2017-04-13 9 views
0

渡すオブジェクトへの参照を持つ関数にオブジェクトを渡しているときに子クラスが呼び出されていますが、オブジェクト基底クラスとしての引数が呼び出されています。以下の例は、私の疑いが何であるかを明確にします。オブジェクトを参照型として引数を持つ関数に渡したときと、オブジェクトを渡すときに別の出力が出る

#include <iostream> 
using namespace std; 

class Base 
{ 
protected: 
    int i; 
public: 
    Base(int a)  { i = a; } 
    virtual void display() 
    { cout << "I am Base class object, i = " << i << endl; } 
}; 

class Derived : public Base 
{ 
    int j; 
public: 
    Derived(int a, int b) : Base(a) { j = b; } 
    virtual void display() 
    { cout << "I am Derived class object, i = " 
      << i << ", j = " << j << endl; } 
}; 

// Global method, Base class object is passed by value 
void somefunc (Base &obj) 
{ 
    obj.display(); 
} 

int main() 
{ 
    Base b(33); 
    Derived d(45, 54); 
    somefunc(b); 
    somefunc(d); // Object Slicing, the member j of d is sliced off 
    return 0; 
} 

O/P:私は基本クラスオブジェクト、I = 33 I午前派生クラスオブジェクト、I = 45、J = 54

iが "void somefunc (Base obj)"

次に宣言していた場合出し O/Pは次のとおりです。私は、私は= 33私は、私は= 33

はあなたが 1st場合には言及してい
+1

ご質問はありますか? – Beginner

答えて

1

プログラムの出力は、基本クラスオブジェクトベースクラスのオブジェクトである い い ちょうど良い。これは、Baseクラスの参照にDerivedクラスのオブジェクトを割り当てても問題ありません。何も間違っていない! 2番目のケースの場合、void somefunc (Base obj)の場合、コピーコンストラクタBaseクラスが呼び出され、Baseについては何も知らないため、オブジェクトはDerivedのオブジェクトを渡すとオブジェクトがスライスされます。Base`はDerivedオブジェクトから取得されます。

関連する問題