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