Краткий ответ: Объявляя 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()
.