【发布时间】:2022-07-18 22:32:48
【问题描述】:
我遇到了一段代码,归结为:
class Base
{
virtual void foo() = 0;
};
class Derived : public Base
{
inline void foo() { /* Implementation */}
};
我知道编写此代码的人来自 C 背景,因此这可能不是正确的做法。我知道Derived::foo 是隐式虚拟的,但我对纯虚函数的实现是否可以内联有点困惑。这被认为是一种好的做法吗?这个内联函数实际上是否被放置在 vtable 中(尽管我想否则会导致编译器错误)?此外, inline 关键字是否完全多余,因为类中的定义首先应该暗示内联?
【问题讨论】:
-
定义在类体内,所以即使没有
inline关键字,它也会被“内联”——这意味着它不会违反 ODR。至于一个好的做法,总是安全地写void foo() override {/* impl */ },以防函数名出现错误时出现编译错误。 -
两件事。首先,
inline是多余的;在类定义中定义的任何成员函数都是隐式内联的。其次,编译器会做它需要做的事情来使它工作。在某些情况下,它可以内联扩展函数;在其他人中它不能。如果不能,它将创建一个离线定义。 -
这很好,但如果使用动态库会带来重复 RTTI 的危险,并且在某些情况下可能会发生奇怪的事情。
标签: c++ inheritance inline