C++ 头文件中实现的隐式内联虚函数
在.h文件中编写函数及其实现(隐式内联),同时使用virtual关键字: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()一样好 这被认为是内联的吗 是的。但是这里的内联并不意味着通常的解释是将函数调用替换为其内容。虚拟函数解析发生在运行时,因此绝对
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:Butinline
与函数的任何特定用法是否内联无关(除非编译器可能将其用作提示)。这意味着函数是在使用它的每个翻译单元中定义的,这与它是否为虚拟无关。inline
和virtual
是不相关的…@Synxis,不是真的。假设存在一个virtual
函数层次结构,并使用指针/引用调用它们。然后它会将编译器限制为r将这些函数调用替换为其内容(典型的宏样式内联)。@iammilind:但是inline
与函数是否有任何特定用途无关