Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 头文件中实现的隐式内联虚函数_C++_Function_Header_Virtual_Inline - Fatal编程技术网

C++ 头文件中实现的隐式内联虚函数

C++ 头文件中实现的隐式内联虚函数,c++,function,header,virtual,inline,C++,Function,Header,Virtual,Inline,在.h文件中编写函数及其实现(隐式内联),同时使用virtual关键字: virtual void g(){cout<<"is Inline?"}; virtualvoid g(){cout 虚拟功能是没有意义的,因为功能是 在.h中实现 Nope。没有理由这么认为。头文件经过预处理并复制粘贴到包含它的任何位置。因此,最终它与在任何.cpp文件中实现g()一样好 这被认为是内联的吗 是的。但是这里的内联并不意味着通常的解释是将函数调用替换为其内容。虚拟函数解析发生在运行时,因此绝对

在.h文件中编写函数及其实现(隐式内联),同时使用virtual关键字:

virtual void g(){cout<<"is Inline?"};
virtualvoid g(){cout
虚拟功能是没有意义的,因为功能是
在.h中实现

Nope。没有理由这么认为。头文件经过预处理并复制粘贴到包含它的任何位置。因此,最终它与在任何.cpp文件中实现
g()
一样好

这被认为是内联的吗

是的。但是这里的
内联
并不意味着通常的解释是将函数调用替换为其内容。
虚拟
函数解析发生在运行时,因此绝对不能以那种(宏样式)方式内联。
这意味着,编译器保证只为所有翻译(.cpp文件)单元生成一个定义。因此链接器不会抱怨多个定义错误

虚拟功能是没有意义的,因为功能是 在.h中实现

Nope。没有理由这么认为。头文件经过预处理并复制粘贴到包含它的任何位置。因此,最终它与在任何.cpp文件中实现
g()
一样好

这被认为是内联的吗

是的。但是这里的
内联
并不意味着通常的解释是将函数调用替换为其内容。
虚拟
函数解析发生在运行时,因此绝对不能以那种(宏样式)方式内联。

这意味着,编译器保证只为所有翻译(.cpp文件)生成一个定义单位。因此链接器不会抱怨多个定义错误。

如果您声明函数
virtual
,则该函数为virtual,period。但是,由于虚拟函数通常在运行时选择,因此编译器通常无法内联它们。如果您在对象上调用函数,编译器可能会内联它,因为调用可以在编译时解析。但它无法通过引用或指针内联调用,因为它无法在编译时解析动态类型


考虑到这里的
inline
关键字和隐式内联对编译器都不是强制性的;它们只是建议。但是
virtual
关键字是强制性的。

如果声明函数
virtual
,则它是虚拟的,句号。但是,由于虚拟函数通常是在运行时选择的,通常,编译器无法内联它们。如果在对象上调用函数,编译器可能会内联它,因为调用可以在编译时解析。但它无法通过引用或指针内联调用,因为它无法在编译时解析动态类型

考虑到这里的
inline
关键字和隐式内联对编译器都不是必需的;它们只是建议。但是
virtual
关键字是必需的

虚拟功能是否因为在.h中实现而毫无意义

不。
virtual
inline
是完全独立的概念

virtual
表示根据调用函数的对象的动态类型,在运行时(如有必要)选择要调用的函数

inline
意味着您可以在多个翻译单元中定义函数,并且必须在使用它的任何翻译单元中定义它。这是允许函数内联的必要条件(对于某些编译器),但不会强制所有调用都内联。特别是,虚拟调用通常不会内联(除非动态类型可以在编译时确定),因此
virtual
肯定会保留其含义

这被认为是内联的吗

是的,但(如上所述)这并不意味着所有调用都将内联

虚拟功能是否因为在.h中实现而毫无意义

不。
virtual
inline
是完全独立的概念

virtual
表示根据调用函数的对象的动态类型,在运行时(如有必要)选择要调用的函数

inline
意味着您可以在多个翻译单元中定义函数,并且必须在使用它的任何翻译单元中定义它。这是允许函数内联的必要条件(对于某些编译器),但不会强制所有调用都内联。特别是,虚拟调用通常不会内联(除非动态类型可以在编译时确定),因此
virtual
肯定会保留其含义

这被认为是内联的吗


是的,但是(如上所述)这并不意味着所有调用都是内联的。

内联的
虚拟的
是不相关的…@Synxis,不是真的。假设存在一个
虚拟的
函数层次结构,并使用指针/引用调用它们。然后它将限制编译器用其内容替换这些函数调用(典型的宏样式内联)。@iammilind:But
inline
与函数的任何特定用法是否内联无关(除非编译器可能将其用作提示)。这意味着函数是在使用它的每个翻译单元中定义的,这与它是否为虚拟无关。
inline
virtual
是不相关的…@Synxis,不是真的。假设存在一个
virtual
函数层次结构,并使用指针/引用调用它们。然后它会将编译器限制为r将这些函数调用替换为其内容(典型的宏样式内联)。@iammilind:但是
inline
与函数是否有任何特定用途无关