嗨,我和我的朋友讨论过为什么没有内联虚函数。
我的回答是内联函数在编译时期进行处理,而虚函数在动态时间绑定。在编译时期不可能知道会调用哪个虚函数。因此,内联虚函数并不是一个好的想法。
然而,他说这不正确。
他的答案是内联函数没有地址,在虚表中无法放置内联函数的地址,因此没有内联虚函数。
我想知道以下三点:
- 我的答案是否正确?我认为我的答案是正确的。
- 内联函数是否没有地址?我认为它有地址;
- 即使内联函数有地址,他的答案是否比我的更好?
非常感谢!
嗨,我和我的朋友讨论过为什么没有内联虚函数。
我的回答是内联函数在编译时期进行处理,而虚函数在动态时间绑定。在编译时期不可能知道会调用哪个虚函数。因此,内联虚函数并不是一个好的想法。
然而,他说这不正确。
他的答案是内联函数没有地址,在虚表中无法放置内联函数的地址,因此没有内联虚函数。
我想知道以下三点:
非常感谢!
我不喜欢任何一个答案。
inline
函数是可以定义多次的函数(虽然定义必须匹配)。这就是为什么它们可以放在头文件中。它们像任何其他函数一样有一个地址。
virtual
函数是可以被派生类覆盖的函数。
您可以轻松地拥有一个可以被派生类覆盖并且可以有多个定义的函数:
struct foo {
virtual void f();
}
inline void foo::f() {}
话虽如此,任何函数都可以被内联,即在调用点插入其代码,而不是实际调用它。这并不阻止以任何方式获取其地址。即使未标记inline
的虚函数也可以在编译器静态解析的情况下被内联。