Search code examples
c++virtual

Can subclass inline a pure virtual method that is not inline in the base?


As I understand it, the compiler can inline a virtual function call when it knows at compile time what the type of the object will be at runtime (C++ faq).

What happens, however, when one is implementing a pure virtual method from a base class? Do the same rules apply? Will the following function call be inlined?

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

EDIT:

I think my original example code was actually a poor representation of what I wanted to ask. I've updated the code, but the question remains the same.


Solution

  • The answer is of course "it depends", but in principle there's no obstruction to optimization. In fact, you're not even doing anything polymorphic here, so this is really straight-forward.

    The question would be more interesting if you had code like this:

    child c;
    base & b = c;
    b.print();
    

    The point is that the compiler knows at this point what the ultimate target of the dynamic dispatch will be (namly child::print()), so this is eligible for optimization. (There are two separate opportunities for optimization, of course: one by avoiding the dynamic dispatch, and one coming from having the function body of the target visible in the TU.)