2013-04-20 2 views
0

У меня есть класс C++, унаследованный от класса A. Возможно, я пропустил важную концепцию ООП, и это, безусловно, довольно тривиально, но я не понимаю, как я могу, после конкретизацией 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_foo и m_barb) до 10 и 30, соответственно, , Поэтому я должен напечатать «10; 30», а не «0; 1».

Большое спасибо за вашу помощь,

ответ

3

Вы не можете использовать конструктор, чтобы изменить объект, только построить его. Чтобы изменить уже построенный объект, вам нужно использовать его public и protected (в случае производных class). В вашем примере A необходимо реализовать функцию-член reset(), которая позднее может быть использована для сброса состояния.

+0

Благодарим за быстрый ответ. Это имеет смысл:). –

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'. Интуитивно я предполагаю, что этого больше не существует. –

+0

Ничего не происходит с 'm_loc'. Это потребует вызова 'B :: operator =()' с экземпляром 'B', но это не то, что делает код. Он вызывает 'A :: operator =()' с экземпляром 'A', поэтому будут затронуты только члены' A' (теоретически, так как я никогда не использовал операторы присваивания базового класса вне операторов присваивания производных классов, подобных этому). –

Смежные вопросы

 Смежные вопросы