Как переопределить член базового класса после наследования в C ++ - PullRequest
0 голосов
/ 14 июля 2009

у меня есть это:

class A {
    public :
        A(int i ) : m_S(i)
        {  
            m_Pa = new Foo(*this) ;
        }
    private :
        int m_S ;
        Foo* m_Pa;
}

and derived class 

class B : public A {
    public :
        B() : A (242) 
        {
          // here i like to override the A class m_Pa member but i don't know how to do it right 
        }
}

Ответы [ 4 ]

1 голос
/ 14 июля 2009

Что такое м_Па? Вы никогда не заявляли об этом. Предполагая, что это закрытый член данных типа Foo * в классе A, вы не можете напрямую изменить его в производном классе, если не измените интерфейс A. Например, вы можете предоставить функцию защищенного члена-установщика:

class A {
....
protected:
 void setFoo(const Foo* foo);
}

class B {
 ....
 Foo *foo = new Foo(this);
 setFoo(foo);
}
1 голос
/ 14 июля 2009

ваш м_Па должен быть защищен, чем вы можете позвонить, как:

 B() : A (242), m_Pa(12) 
 {

 }

или

 B() : A (242)
 {
   m_PA = 55
 }

или вы должны сделать публичную или защищенную функцию, которая меняет m_Pa

 class A {
     public :
         A(int i ) : m_S(i)
         {  
              m_Pa = new Foo(*this) ;
         }

        void setPA(int val)
        {
             m_PA = val;
        }
0 голосов
/ 14 июля 2009

Краткий ответ: Объявляя m_Pa private, вы говорите, что только class A может изменить его. Таким образом, вы не можете изменить его значение, используя методы class B.

Более длинный ответ: В C ++ (и большинстве других объектно-ориентированных языков программирования) вы объявляете не только тип члена, но и его видимость (public, protected и private). Это позволяет вам инкапсулировать данные: вы открываете только интерфейс, но не позволяете клиентам вашего класса напрямую изменять его внутренние компоненты.

В вашем конкретном примере я бы создал аксессоры

Foo* getPa() {
  return m_Pa;
}

void setPa(Foo* Pa) {
  m_Pa = Pa;
}

в class A и используйте их в class B для изменения m_Pa. Если вы хотите, чтобы class B (но не связанные классы) могли изменять m_Pa, объявлять getPa() и setPa() в секции protected: вашего класса; если вы хотите, чтобы любой клиент изменил их, объявите их в разделе public:. Особенно в последнем случае вам нужно начать беспокоиться о владении объектом, то есть о том, какой объект отвечает за удаление объекта, хранящегося в m_Pa, который создается в конструкторе. Практическое решение этой проблемы заключается в использовании интеллектуальных указателей, например, см. boost boost .

Примечание по терминологии: «Переопределение» члена в C ++ обычно относится к предоставлению новой реализации virtual функции-члена. Так что если у вашего class A есть метод

virtual void doIt()

тогда член того же типа в class B переопределяет реализацию A doIt().

0 голосов
/ 14 июля 2009

Вы не можете переопределить переменные-члены в производном классе, только методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...