Re: Overriding/Redefining a Non-Virtual Function in Derived Classes
Michael K. O'Neill wrote:
In Scott Meyers' "Effective C++", item 36 states "Never redefine an
inherited non-virtual function". This admonition is repeated at item 23.8
of C++ FAQ Lite ("[23.8] Should a derived class redefine ("override") a
member function that is non-virtual in a base class?" at
http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.8 ).
The FAQ is not entirely accurate when it states that calls to a
non-virtual method "are dispatched based on the static type of the
pointer/reference [used to make the call]." In fact, that is only true
for calls to methods whose names are unqualified. A call to a method
with a qualified name will always be dipatched based on the static
qualification of the name and not be based on the static type of the
object.
I only just now recognized that in the MFC framework, this is done all the
time. Particularly with respect to message handlers for CWnd-derived
classes, it's common to see code like:
BOOL CDerivedWnd::OnEraseBkgnd(CDC* pDC)
{
// call base class function, which is not a virtual function
CWnd::OnEraseBkgnd(pDC);
// ... code specific to derived class
return TRUE;
}
In this example, the program calls CWnd's implementation of
OnEraseBkgnd() (assuming that CWnd has implemented one, otherwise it
calls the implementation of OnEraseBkgnd() that CWnd inherits). So
whether OnEraseBkgnd() is a virtual method or not, or whether other
classes have overriden OnEraseBkgnd() method or not, or whatever the
"this" object's dynamic type should happen to be - none of these
factors has any bearing on how the call to onEraseBkgrnd() will be
dispatched in this example.
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]