我正在制作一个从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;
...
};
答案 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
进一步了解此说明符 ...