лучшая практика для наследования C ++ - PullRequest
4 голосов
/ 31 января 2020

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

int A::different_method()
{ return 1; }

int A::common_method()
{ return this->different_method()+1; }

int B::different_method()
{ return 2; }

int B::common_method()
{ return this->different_method()+1; }

, как лучше всего это сделать?

Один из способов - сделать A и B наследуются от базового класса C с новыми методами:

int A::different_method()
{ return 1; }

int B::different_method()
{ return 2; }

int C::different_method()
{ return 0; }

int C::common_method()
{ return this->different_method()+1; }

, но немного раздражает, что я также должен определить бесполезный C::different_method. Какова лучшая практика для таких ситуаций?

Ответы [ 4 ]

3 голосов
/ 31 января 2020

Попробуйте использовать чисто виртуальную функцию :

struct Base {
    virtual int different_method() = 0;

    int common_method() {
        return different_method() + 1;
    } 
};

struct Derived1 : Base {
    int different_method() override {
        return 1;
    }
};

struct Derived2 : Base {
    int different_method() override {
        return 2;
    }
};

Проверьте это Live

2 голосов
/ 31 января 2020

Один из способов - заставить А и В наследоваться от базового класса C,

Да, вам понадобится база class C

class C {
public:
  virtual ~C() { }

  virtual int different_method() = 0;

  virtual int C::common_method() { 
     return this->different_method()+1; 
  }

}

class A: public C {
   // Implement 
   int different_method() override;
};

class B: public C {
   int different_method() override;
};
1 голос
/ 31 января 2020

Если вам просто нужно использовать классы A и B, вы можете объявить свой класс C как абстрактный и реализовать только common_method(). different_method() может быть объявлено в заголовочном файле класса C как чисто виртуальная функция таким образом:

virtual different_method()=0

Я оставляю вам полезную ссылку для чистой виртуальной функции и абстрактного класса

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

Вы действительно привязаны к синтаксису A a; a.common_method()?

Почему бы не

template <typename T>
int common_free_function(T& t) {
    return t.different_method() + 1;
}

A a;
B b;
common_free_function(a);
common_free_function(b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...