c++ - 子类可以内联一个不在基类中内联的纯虚方法吗?

标签 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;
}

编辑:

我认为我原来的示例代码实际上不能很好地表达我想问的问题。我已经更新了代码,但问题仍然存在。

最佳答案

编译器永远需要内联函数调用。在这种情况下,允许内联函数调用,因为它知道 c 的具体类型(因为它不是通过指针或引用间接定向的,编译器可以查看它作为 child 分配的位置)。这样,编译器就知道使用了print()的哪个实现,可以选择不进行vtable间接寻址,进一步选择内联函数的实现。

但是,编译器也可以内联它;它可能会插入对 child::print() 的直接调用,或通过 vtable 间接调用,如果它决定这样做的话。

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

关于c++ - 子类可以内联一个不在基类中内联的纯虚方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601256/

相关文章:

c++ - 将 boost spirit 用于基于堆栈的语言

c++ - 检索 QProcess 的环境变量

c++ - 将 std::vector 传递给构造函数并移动语义

c++ - 在 C++ 中声明纯虚函数时, "= 0;"做了什么?

c++ - 在 C++ 中的抽象接口(interface)上实现运算符重载

c++ - 如何在 openGL 中获取同质屏幕空间坐标

c++ - 将 std::future 和 std::promise 与非 std::thread 一起使用是否安全?

java - 如何更改虚拟 url 中的应用程序根目录

c++ - 使 operator<< 成为虚拟的?

C++虚赋值运算符