2017-04-13 16 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 = 45,J = 54

如果我聲明 「void somefunc (Base obj)

然後出放爲 O/P: 我基類對象,I = 33 我基類對象,I = 33

您在 1st情況下都提到
+1

你的問題是什麼? – Beginner

回答

1

計劃輸出 正好。這是因爲將Derived類的對象分配給參考Base類是完全正確的。它沒有錯!對於第二種情況,void somefunc (Base obj),如果傳遞的Derived對象,因爲Base類的拷貝構造函數將被稱爲對象切片總會發生,並且它不知道任何關於Derived' so only part of Base`將從派生的對象服用。