【问题标题】:Overriding a pure virtual function with inline implementation用内联实现覆盖纯虚函数
【发布时间】: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


【解决方案1】:

该方法已经隐含为inline,因为它出现在类定义中。

inline 不是你想的那样。它不是控制对函数的调用是否由编译器内联。编译器将独立于属性inline 来决定这一点。它只是说:定义可以在一个标题中,多个定义不会出现问题。

例如,您可以将所有这些放在标题中:

class Derived : public Base
{
    void foo(); 
};

inline Derived::foo() { /* implementation */ }

当成员函数定义在类体中时,它是隐含的inline

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 2021-09-30
    • 2020-08-21
    • 2022-01-13
    • 2014-05-22
    • 2019-09-13
    • 2013-01-16
    • 2016-03-07
    • 2016-02-05
    相关资源
    最近更新 更多