views:

500

answers:

3
+9  A: 

You can do three things:

1. Unhide the base class method

Add a using in the Node declaration:

using Bound::rebound;
void rebound() { rebound(left, right); }

2. Explicitly refer to the base class method

Use the Bound namespace:

void rebound() { Bound::rebound(left, right); }

3. Define/redefine all overloads in the derived class

Delegate the implementation to the base class (if this is done in the header, there shouldn't be any penalty thanks to inlining):

void rebound(const Bound *a, const Bound *b) { Bound::rebound(a, b); };
void rebound() { rebound(left, right); }

More info: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9

Ates Goral
Scott Meyers also talks extensively about pitfalls of inheritance in its "Effective C++ (Third Edition)", Chapter 6.
Julien L.
+1  A: 

This is called hiding the parent member function. You can explicitly call it (by Bound::rebound(left, right) as @Ates Goral said) or you can add a using Bound::rebound in your Node class definition.

See http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9 for more info.

Jesse Beder
+1  A: 

When you declare a method in the subclass with the same name but a different signature, it actually hides the version from the parent.

You could refer to it specifically as Bound::rebound(...) or use the using keyword.

See here

Uri