Как инкапсулировать пользовательскую функцию из подкласса в C ++ - PullRequest
0 голосов
/ 10 января 2020

Для объяснения моей проблемы я написал несколько примеров.

class Product {
public:
  Product(Module& module, Config module_cfg) : module_(module) {
    module_.SetConfig(module_cfg);
  }

  void Work() {
    module_.Work();
  }

private:
  Module& module_;
};

class Module {
public:
  void SetConfig(Config cfg) {
    cfg_ = cfg;
  }

  virtual void Work() = 0;

protected:
  Config cfg_;
};


class ModuleA : public Module {
  void Work() override {
    cfg_.GetSomething(); // use config
  }
};
  1. "Product" имеет "Module" в качестве композиции.
  2. "Module" работает с "Config" .
  3. "Модуль" является родительским классом для "ModuleA".

Я хочу инкапсулировать метод "SetConfig ()" из "ModuleA" !!

Вкл. Другими словами, есть ли способ скрыть пользовательские функции от унаследованного класса?

1 Ответ

0 голосов
/ 10 января 2020

Вы можете сделать функцию private, а не public (или protected).

Тогда производные классы не смогут получить к ней доступ.

Конечно никто другой (кроме базового класса, в котором находится функция) также не сможет получить к нему доступ. Но нет смысла разрешать «глобальный» доступ без разрешения доступа от производных классов.

Если вы do хотите, чтобы SetConfig были опубликованы c, тогда просто не не вызывайте его из производного класса, если не хотите. Если вы делаете это по ошибке, исправьте ошибку.

...