On 09/04/2013 05:24 AM, Benjamin Smedberg wrote:
>> MOZ_OVERRIDE implies virtual, you get a compile error when you put 
>> MOZ_OVERRIDE on a non virtual
> It does? That surprises me (it certainly wasn't the original intent of 
> NS_OVERRIDE). There are certainly cases where we want to override non-virtual 
> methods with an identical signature.

C++11 override functionality only works on virtual methods.  Agreed it's 
somewhat unfortunate it's only on virtual methods -- else I'd have used it on 
all the deleted methods in js/src/vm/String.h -- but that's how the language 
works.  We could of course add a new macro, plugging into static analysis, if 
we wanted inherited-signature-matching functionality that worked on 
non-virtuals.

Making virtual mandatory, and MOZ_OVERRIDE mandatory when applicable (to 
slightly expand this thread's scope), sounds good to me.

The only edge case is if you have a template class inheriting from a 
template-selected base, and the template class has a method that's virtual 
depending on the selected base class:

template<class Base>
struct Foo : public Base
{
  void fun() {}
};

struct B1 { virtual void fun(); };
struct B2 { void fun(); };

Foo<B1>().fun(); // virtual
Foo<B2>().fun(); // non-virtual

There's probably a use case for this.  SecurityWrapper is probably close but no 
cigar; nothing closer springs immediately to mind.  This case would preclude 
adding virtual or MOZ_OVERRIDE to Foo::fun's declaration -- probably a bridge 
to cross if we get to it, of course.

Jeff
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to