您好我与朋友讨论了为什么没有内联虚拟功能。
我的回答是内联函数在编译时,虚函数在动态时绑定。在编译时,无法知道哪个函数会调用虚函数。所以内联虚函数不是一个好主意。
然而,他说,这不正确。
他的回答是内联函数没有地址,所以在虚拟表中,没办法放入内联函数的地址,所以没有内联虚函数。
我想知道三点:
非常感谢!
答案 0 :(得分:7)
我不喜欢任何一个回答。
inline
函数是可以多次定义的函数(但定义必须匹配)。这就是为什么它们可以放在头文件中。他们有一个地址就像任何其他功能一样。
virtual
函数是可以被派生类覆盖的函数。
您可以拥有一个可以被派生类覆盖并且可以轻松拥有多个定义的函数:
struct foo {
virtual void f();
}
inline void foo::f() {}
也就是说,任何函数都可以内联,即在调用时插入代码,而不是实际调用它。这并不妨碍以任何方式获取其地址。如果编译器可以静态解析它们,甚至可以内联未标记为inline
的虚函数。