Частное наследование с использованием директивы, перегрузки? - PullRequest
9 голосов
/ 12 января 2011

Я использую частное наследование в проекте, в смысле «реализовано в терминах». Базовый класс определяет operator [], и это функциональность, которую я хочу использовать. Таким образом, у меня есть

class A : private B {
    using B::operator[];
    // ...
};

Однако, как я могу контролировать, какую версию оператора [] я получу? На самом деле, мне нужно более одной версии: const и не const. Можно ли это сделать?

Ответы [ 2 ]

6 голосов
/ 12 января 2011

Насколько я понимаю, ваш using должен автоматически вводить все различные перегрузки оператора. Существуют ли определенные перегрузки, которые вы хотите исключить из того, чтобы быть введенными в дочерний класс? В этом случае может быть лучше разделить работу на несколько функций с разными именами в родительской функции и только using те, которые вам нужны.

2 голосов
/ 12 января 2011

Это соответствует ожиданиям:

class A
{
public:
  int operator[](int idx) { return 0; }
  int operator[](int idx) const { return 1; }
};

class B : public A
{
public:
  using A::operator[];

  void opa() { cout << operator[](1) << endl; }
  void opb() const { cout << operator[](1) << endl; }
};

int main(void)
{
  B b;
  b.opa();
  b.opb();

  const B d = B();
  cout << d[1] << endl; // should trigger the const version of operator[]
  return 0;
}

Другими словами, соответствующие версии const / nonstst внедряются в B.ПРИМЕЧАНИЕ. Если const-версия не указана, вы получите ошибку компилятора (это работает независимо от того, является ли наследование частным или общедоступным).

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