派生 class 的内联函数能否覆盖基 class 的非内联函数?

Can an inline function of the derived class override a non-inline function of the base class?

我正在制作一个继承自 std::fstream 的 class。我正在制作自定义 eof() 函数。该函数 returns bool internal_eof 变量的值在与 std::fstream::eof() 略有不同的条件下设置和重置。这些条件特定于我的应用程序的性质。 bool internal_eof 的值由此处未显示的其他函数确定。由于我定义的 BufferedFile::eof() 函数只包含 returnbool internal_eof 变量的单个语句,因此我决定将其设为 inline 函数。我想知道,派生 class 的 inline 函数是否可以覆盖基 class 的非 inline 函数?标准怎么说?你们更有经验的程序员对此了解多少?我真的没有时间手动测试这个,因为 fstream::eof()BufferedFile::eof() 表现相似~85% 的时间。只有一些边缘情况需要这个解决方案,而且它们不容易重现。了解此解决方案是否可行对于项目的进一步发展至关重要。

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

除了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 以了解有关此 说明符 的更多信息...

inline 关键字的初衷是提示优化器 function/method 更适合作为 内联替换 的候选者。但是,编译器可以自由地对任何函数使用内联替换,即使它没有标记为 inline.

在现代编译器中,inline 较少用于优化,但用于通知编译器函数(和变量,自 C++17 起)定义可能出现在多个翻译单元中,它应该考虑它们作为相同的定义。 (参见 inline specifier

无论如何,inline 关键字是编译器使用的说明符,实际上并不是方法签名的一部分,并且 virtual 方法可以在派生 类 中被覆盖只要他们的签名没有改变,无论是否声明为 inline