Переопределение чистых виртуальных функций C ++ - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующие классы:

Класс режима h-файл:

#pragma once

class Mode
{

public: 
    virtual int recv()  = 0;
};

Класс режима cpp -файл: -> пустой

Класс LocalMode h-файл:

#pragma once
#include "Mode.h"

class LocalMode: public Mode
{
private: 

public: 
    LocalMode();
    int recv();

};

Класс LocalMode cpp -файл:

#include "LocalMode.h"

int LocalMode::recv(){
    return 0;
}

Вот мои вопросы:

  1. Всегда ли необходимо ключевое слово "переопределить"? Если нет, то каковы лучшие практики?

  2. Главный вопрос: Я знаю, что приведенный выше код мне подходит. Но у меня проблема в том, что мне в основном приходится «копировать» сигнатуру чистой виртуальной функции из базового класса в мой производный класс. Что произойдет, если я не знаю, какие чистые виртуальные функции есть в базовом классе?

    Моя реализация выше подразумевает, что я должен знать все чистые виртуальные функции, доступные в базовом классе. Я попытался получить доступ к чистой виртуальной функции с помощью Mode :: scope и LocalMode :: scope, но в Visual Studio я просто получил несколько сообщений об ошибках (я считаю, что эти сообщения об ошибках не имеют отношения к этому вопросу).

  3. Некоторые плагины / Intellisense? Я помню, что в java IntelliSense в целом выручил меня и добавил необходимые функции из класса abtract. Хотя я знаю, что java в этом смысле немного отличается (наследуется от классов abtract) от c ++, я также хотел бы, чтобы есть какие-либо инструменты, которые помогают мне включать их автоматически?

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

Заранее благодарю.

1 Ответ

1 голос
/ 06 мая 2020

Всегда ли необходимо ключевое слово «переопределить»? Если нет, то каковы лучшие практики?

Это никогда не «необходимо». Переопределение работает с этим ключевым словом или без него. Он предназначен только для того, чтобы помочь вам предотвратить такие проблемы, как опечатки и т.д.


Главный вопрос: я знаю, что приведенный выше код у меня работает. Но у меня проблема в том, что мне в основном приходится «копировать» сигнатуру чистой виртуальной функции из базового класса в мой производный класс. Что произойдет, если я не знаю, какие чистые виртуальные функции есть в базовом классе?

Вы не можете этого не знать. Чтобы унаследовать от класса, компилятор требует полного определения этого класса, что обычно означает, что у вас есть #include d (и у вас есть доступ к этому определению).


Моя реализация выше подразумевает, что Я должен знать все чистые виртуальные функции, доступные в базовом классе. Я попытался получить доступ к чистой виртуальной функции с помощью Mode :: scope и LocalMode :: scope, но в Visual Studio я просто получил несколько сообщений об ошибках (я считаю, что эти сообщения об ошибках не имеют отношения к этому вопросу).

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


Некоторые плагины / Intellisense?

То есть явно off-topi c для StackOverflow, но есть много IDE для C ++, у вас не должно возникнуть проблем с их поиском.

...