派生 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()
函数只包含 return
和 bool 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
。
我正在制作一个继承自 std::fstream
的 class。我正在制作自定义 eof()
函数。该函数 returns bool internal_eof
变量的值在与 std::fstream::eof()
略有不同的条件下设置和重置。这些条件特定于我的应用程序的性质。 bool internal_eof
的值由此处未显示的其他函数确定。由于我定义的 BufferedFile::eof()
函数只包含 return
和 bool 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
。