子类可以内联一个非基类内联的纯虚方法吗?

Eug*_*e S 1 c++ virtual

据我所知,编译器可以在编译时知道对象的类型在运行时(C++ faq)时内联虚函数调用.

但是,当一个人从基类实现纯虚方法时会发生什么?是否适用相同的规则?下面的函数调用是否会被内联?

class base
{
public:
    virtual void print() = 0;

    virtual void callPrint()
    {
        print(); // will this be inline?
    }
};

class child : public base
{
public:
    void print() { cout << "hello\n"; }
};

int main()
{
    child c;
    c.callPrint();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我认为我原来的示例代码实际上是我想要问的不好的代表.我已经更新了代码,但问题仍然存在.

bdo*_*lan 10

编译器永远不需要内联函数调用.在这种情况下,允许内联函数调用,因为它知道具体类型c(因为它没有通过指针或引用间接,编译器可以看到它被分配为a的位置child).因此,编译器知道使用了哪个实现print(),并且可以选择不执行vtable间接,并进一步选择内联函数的实现.

但是,编译器也可以自由地内联它; child::print()如果它决定这样做,它可以直接调用vtable,或间接通过vtable.

这些优化通常归结为"as-if"规则 - 编译器必须表现为 - 如果它正在执行完整的vtable间接 - 这意味着结果必须相同,但编译器可以选择不同的实现方法结果如果结果相同.这包括内联等

  • +1`inline`是编译器提示.在一天结束时,编译器将执行它认为最好的操作并感谢上帝! (2认同)