Hi WebKittens!

I’m about to re-land <http://webkit.org/b/115977> now that the OS X bots have 
had their clang installations updated.

Let me take a moment to explain what FINAL and OVERRIDE do, and how to apply 
them.

OVERRIDE is used to decorate virtual methods that override a method inherited 
from a superclass. This makes the code slightly more self-documenting but more 
importantly, gives us a compiler warning if there is no superclass method with 
the same signature. In other words, OVERRIDE protects you from forgetting to 
update subclasses when changing the signature of a method in a superclass.

Example of OVERRIDE:

class Human { 
public:
    virtual void eat();
};

class Anders : public Human { 
public:
    virtual void eat() OVERRIDE;
};

If you rename eat() to drink() in “B”, you’ll get a compiler warning:
huehuehue.cpp:8:15: error: 'drink' marked 'override' but does not override any 
member functions

FINAL is used to decorate overridden virtual methods that are known (at compile 
time) to have no further subclass overrides. This allows the compiler to 
optimize call sites that operate on specific-enough pointer types to avoid the 
overhead of virtual dispatch.

If a subclass is known to never have any subclasses, the whole class can be 
marked FINAL, which is equivalent to making every overridden function in that 
class FINAL.

Example of FINAL:

class Human { 
public:
    virtual void dance();
};

class Swede : public Human { 
public:
    virtual void dance() OVERRIDE FINAL;
};

class Anders : public Swede {
public:
    virtual void dance() OVERRIDE { /* No. */ }
};

This code will fail with the following error:

teehee.cpp:15:18: error: declaration of ‘dance' overrides a 'final’ function

In other words, if Anders really wants to dance differently from other Swedes, 
you’ll have to remove the FINAL from Swede::dance().

What happens when we tell Anders to dance?

Human* man = getHuman();
man->dance(); // Virtual function call

Anders* ders = getAnders();
ders->dance(); // Inlined!

Because the compiler knows that “ders” is of type Anders, it doesn’t have to do 
a virtual function call, but can just inline the dance() implementation (or 
lack thereof) right there.

Pretty cool right? Giving the compiler this information means that it can 
generate smaller and faster code wherever we are using tighter pointer types.

Anyways, that’s pretty much it.

-Andreas

PS. Making a whole class FINAL looks like this:

class Countdown FINAL : public SwedishObject {

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to