C ++ избегая ручного вызова функции базового класса - PullRequest
7 голосов
/ 13 марта 2012

У меня есть набор классов, подобных этому:

class A {
 public:
  int DoIt() {
     //common code
  }
};

class B : public A {
  int DoIt() {
    if (A::DoIt() == 1) {
      return 1;
    }
    else {
      // do b specific code
    }
  }
};

class C : public A {
  int DoIt() {
    if(A::DoIt()==1) {
      return 1;
    }
    else {
      // do c specific code
    }
  }
};

Есть ли способ, которым я могу избежать ручного ввода этого кода:

if (A::Doit() == 1) { return 1; } else {

в каждый класс, производный от A

1 Ответ

9 голосов
/ 13 марта 2012

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

class A
{
public:
    int DoIt() /*final*/
    {
        // common code
        if (return_value == 1)
           return 1;
        else
           return DoIt_specific();
    }

private:
    virtual int DoIt_specific() = 0;
    // ^ or some "A"-specific actions if A cannot be abstract.
};

class B : public A
{
    virtual int DoIt_specific() /*override*/
    {
        // specific code for B
    }
};

Это известно как не виртуальный интерфейс идиома.

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