2013-04-20 61 views
0

我有一個C類B繼承自類A.我可能會錯過一個重要的OOP概念,這當然很瑣碎,但我不明白我怎麼可以,後B的實例,可使用A內B的構造函數來重新分配新值從A繼承了局部變量:使用父類的構造函數重新賦值給繼承變量

A類

class A{ 
    public: 
     A(int a, int b){ 
      m_foo = a; 
      m_bar = b; 
      } 
    protected: 
     int m_foo; 
     int m_bar; 
}; 

B類

class B : public A{ 
    public: 
     B(int a, int b, int c):A(a,b),m_loc(c){}; 
     void resetParent(){ 
      /* Can I use the constructor of A to change m_foo and 
      * m_bar without explicitly reassigning value? */ 

      A(10,30); // Obviously, this does not work :) 

      std::cout<<m_foo<<"; "<<m_bar<<std::endl; 
      } 
    private: 
     int m_loc; 
}; 

int main(){ 
    B b(0,1,3); 
    b.resetParent(); 
    return 1; 
    } 

在這個具體的例子中,我想調用b.resetParent()應該調用A::A()到的m_foom_bar(在b)的值改變爲10和30,分別。 因此,我應該打印「10; 30」而不是「0; 1」。

非常感謝您的幫助,

回答

3

不能使用構造改變一個對象,只有構建它。要更改已經構建的對象,您需要使用它的publicprotected(如果派生的class)成員。在您的示例中,A需要實現reset()成員函數,該函數稍後可用於重置其狀態。

+0

感謝您的快速回復。這說得通:)。 – 2013-04-20 22:18:20

2

不,您不能調用基類構造函數來重置值。但是,你想要的值以重被聲明爲protected這意味着B具有直接訪問它們:

void resetParent() 
{ 
    m_foo = 10; 
    m_bar = 30; 

    std::cout << m_foo << "; " << m_bar << std::endl; 
} 

如果A=賦值運算符定義,你可以或者宣佈一個臨時A實例,併爲它分配到基類:

void resetParent() 
{ 
    *this = A(10, 30); 
    // or: 
    // A::operator=(A(10, 30)); 

    std::cout << m_foo << "; " << m_bar << std::endl; 
} 
+0

謝謝,在這個例子中,我的觀點並不是直接觸及m_foo和m_bar。然而,你的第二點對我來說很有意思。我想知道,如果我做這個* = A(10,30)'; 'm_loc'發生了什麼。直覺上,我會想象它不再存在。 – 2013-04-21 08:03:16

+0

'm_loc'沒有任何反應。這需要用'B'實例調用'B :: operator =()',但這不是代碼的作用。它使用'A'實例調用'A :: operator =()',所以只有'A'成員會受到影響(無論如何,因爲我從來沒有在派生類賦值運算符之外使用基類賦值運算符, )。 – 2013-04-21 15:55:57