Может ли встроенная функция производного класса переопределить не встроенную функцию базового класса? - PullRequest
0 голосов
/ 08 декабря 2018

Я делаю класс, который унаследован от std::fstream.Я делаю пользовательскую функцию eof().Эта функция возвращает значение переменной bool internal_eof, которая устанавливается и сбрасывается в условиях, немного отличающихся от условий std::fstream::eof().Эти условия зависят от характера моей заявки.Значение bool internal_eof определяется другими функциями, которые здесь не показаны.Поскольку функция BufferedFile::eof(), которую я определяю, состоит только из одного оператора для return bool internal_eof varaible, я решил сделать ее функцией inline.Мне интересно, может ли inline функция производного класса переопределить не inline функцию базового класса?Что говорит стандарт?Что вы, более опытные программисты, знаете об этом?На самом деле у меня нет времени на тестирование вручную, потому что fstream::eof() и BufferedFile::eof() ведут себя примерно одинаково ~ 85% времени.Есть только некоторые крайние случаи, когда это решение необходимо, и их нелегко воспроизвести.Знание того, является ли это решение жизнеспособным, крайне важно для дальнейшего развития проекта.

class BufferedFile: public fstream {
  public:
    inline bool eof() const { return internal_eof; }
    ...
  private:
    bool internal_eof;
    ...
};

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Первоначальная цель ключевого слова inline была для оптимизатора подсказкой, что функция / метод предпочтительнее быть кандидатом на встроенную замену .Однако компиляторы могут использовать встроенную подстановку для любой функции, даже если она не помечена как inline.

. В современных компиляторах inline менее полезна для оптимизации, но для информирования компилятора о том, чтоОпределение функции (и переменной, начиная с C ++ 17) может встречаться в нескольких единицах перевода, и оно должно рассматривать их как одно и то же определение.(См. встроенный спецификатор )

В любом случае, ключевое слово inline является спецификатором, используемым компилятором, и фактически не является частью сигнатуры метода, и методы virtual могут бытьпереопределяется в производных классах до тех пор, пока их сигнатура не изменяется, независимо от того, объявлена ​​ли она как inline или нет.

0 голосов
/ 08 декабря 2018

За исключением main() ( Он скомпилирован и выполнен во время выполнения , поэтому вы не можете скомпилировать его в время компиляции ), вседопустимые C ++ функции могут быть переопределены:

class Base
{
public:
    virtual ~Base(); // Virtual destructor...
    virtual void example(); // Function is already 'inline' here... So, it is one of the
                            // cases where the 'inline' specifier is redundant...
                            // and similar was found in your class...
};

Здесь inline - это спецификатор, такой как virtual, и не является типом (и при этом она не дает функции возможность стать уникальной ), поэтому ее переопределение не является проблемой ...

class Derived : Base
{
public:
    virtual ~Derived(); // Virtual destructor...
    void example() override;
};

См. inline, чтобы узнать больше об этом спецификатор ...

...