派生类的内联函数可以覆盖基类的非内联函数吗?

时间:2018-12-08 04:08:42

标签: c++ inheritance override fstream

我正在制作一个从std::fstream继承的类。我正在制作一个自定义eof()函数。该函数返回bool internal_eof变量的值,该变量的设置和重置条件与std::fstream::eof()略有不同。这些条件特定于我的应用程序的性质。 bool internal_eof的值由此处未显示的其他函数确定。由于我要定义的BufferedFile::eof()函数仅包含一个对return变量的bool internal_eof语句,因此我决定将其设为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 :(得分:1)

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

在现代编译器中,inline很少用于优化,但用于通知编译器一个函数(和变量,自C ++ 17起)可能在多个翻译单元中出现,因此应将其定义为相同的定义。 (请参见inline specifier

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

答案 1 :(得分:0)

除了main()它是在运行时编译并执行的,因此您不能在编译时 em>),则所有有效的 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进一步了解此说明符 ...