При наследовании от абстрактного класса для создания другого абстрактного класса я должен повторно объявить все виртуальные функции? - PullRequest
1 голос
/ 16 января 2020

Это более предпочтительный вопрос стиля при работе в c ++. Я ищу предпочтительные стандарты вокруг этого.

Скажем, у меня есть интерфейс A

class AInterface {
public:
    virtual ~AInterface() = default;
    virtual void a() = 0;
};

И затем у меня есть другой интерфейс B, который построен поверх A

class BInterface : public AInterface{
public:
    virtual void b() = 0;
    virtual void otherb() = 0;
};

У меня вопрос, нужно ли мне заново объявить все виртуальные функции из AInterface в B, как это?

class BInterface : public AInterface{
public:
    virtual void a() = 0;
    virtual void b() = 0;
    virtual void otherb() = 0;
};

Ответы [ 2 ]

5 голосов
/ 16 января 2020

Нет. Вы не должны.

... и не должны, потому что это ненужное дублирование без пользы. Если вы это сделаете, по крайней мере, используйте ключевое слово override, чтобы избежать несоответствия в объявлениях.

Представьте, что вы изменили базу на

class AInterface {
public:
    virtual ~AInterface() = default;
    virtual void a(int) = 0;
};

и забыли обновить BInterface, тогда ой, теперь у вас есть void a() in BInterface, который не был предназначен. Однако, если у вас есть override:

class BInterface : public AInterface{
public:
    virtual void a() override = 0;
    virtual void b() = 0;
    virtual void otherb() = 0;
};

Вы получите ошибку компилятора, потому что после вышеупомянутого рефакторинга void a() не переопределяет метод из его базы.

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

вы бы повторно объявляли / определяли виртуальные функции в последующих классах, если вы намереваетесь изменить их функциональные возможности по сравнению с базовым классом. Тем не менее, приведенные вами примеры являются чисто виртуальными классами, поэтому вы не сможете их создать. Но в целом одна из точек наследования заключается в том, что вам не нужно постоянно повторно объявлять функции, которые делают одно и то же для производных классов.

...