2017-01-11 77 views
1

假設我有一個基類A和一個派生類B,它添加了一些額外的成員。現在我想爲B類設置一個setter函數,它直接加入自己的成員,但是使用臨時的A對象批量派生派生成員。下面是一些示例代碼:「我可以」我可以像訪問對象一樣訪問對象的「基礎部分」嗎?

class A 
{ 
public: 
    int x; 
    int y; 
    A(int arg1, int arg2) 
     : x(arg1), y(arg2) {} 
}; 

class B : public A 
{ 
public: 
    int z; 
    B(int arg1, int arg2, int arg3) 
     : A(arg1, arg2), z(arg3) {} 
    void setB(int arg1, int arg2, int arg3) { 
     /*something here*/ = A(arg1, arg2); 
     this->z = arg3; 
    } 
}; 

//編輯 我想我是不太清楚這個問題是不是真的而是「我怎麼能?」。爲了更具體些:我可以把什麼代替/*something here*/使組B()的實際工作一樣:

void setB(int arg1, int arg2, int arg3) { 
    this->x = arg1; 
    this->y = arg2; 
    this->z = arg3; } 
+1

你自己嘗試過嗎?我看到沒有問題。同樣,考慮你想達到什麼,這似乎不是一個好主意。 – JKreiser

+0

你*可以,*但在這裏要非常小心。如果你打算通過'A'來引用'B'對象,你可能想要包含一個虛擬析構函數,以便在所有可能使用它們的上下文中使用多態類型獲得適當的銷燬行爲,並查看[切片問題。](http://stackoverflow.com/questions/274626/what-is-object-slicing) – jaggedSpire

+0

@jaggedSpire在這種情況下可以切片導致問題?我不認爲它可以,但也許我錯了。 – Brian

回答

2

我可以訪問我的對象的「基礎部分」,就像它是它自己的對象一樣嗎?

是的。它是父類的完整實例,它位於派生類實例內部。

指針或對派生類的引用可轉換爲父指針/引用。

非指針/引用(即派生類型的值也可以轉換爲父項),但是創建父子對象的副本,就像將任何其他值類型轉換爲另一個值類型總是創建副本一樣。

現在我想爲B類的setter函數直接加載它自己的成員,但是使用臨時的A對象批量派生派生成員。

只需投this或解除引用的參考父類類型:

(A&)*this = A(arg1, arg2); // or 
*(A*)this = A(arg1, arg2); 
1

/*something here*/ = A(arg1, arg2);,你可以投this其基本類型,並調用它的隱含賦值運算符

(*((A*)this))= A(arg1, arg2); 
+1

或'* static_cast (this)' – Brian