// Example 5-15: Finding candidate member functions.
#include <iostream>
#include <ostream>

void proc(int x)
{
  std::cout << "proc(int:" << x << ")\n";
}

class base {
public:
  void f(int) { std::cout << "f(int)\n"; }
  void g(int) { std::cout << "g(int)\n"; }
  void proc(double) { std::cout << "base::proc(double)\n"; }
};

class derived : public base {
public:
  void f(double) { std::cout << "f(double)\n"; }
  void g(double x) {
    std::cout << "g(double)\n";
    proc(42); // calls base::proc(double), not ::proc(int)
  }
  using base::g;
};

// Declared after derived, so call to proc() inside g()
// never sees this proc().
void proc(double x)
{
  std::cout << "proc(double:" << x << ")\n";
}

int main()
{
  derived d;
  d.g(3.14159); // calls g(double)
}
