title: I think the statement below is incorrect or am I missing something?
body: <p>The paragraph below was extracted from page 420 from Stroustup book "The C++ Programming Language" (third edition):</p>
  
  <blockquote>
    <p>Because a pointer to a virtual member (s in this example) is a kind of
    offset, it does not depend on an object’s location in memory. A
    pointer to a virtual member can therefore safely be passed between
    different address spaces as long as the same object layout is used in
    both. Like pointers to ordinary functions, pointers to nonvirtual
    member functions cannot be exchanged between address spaces.</p>
  </blockquote>
  
  <p>I'm disputing the last sentence in this paragraph. Below, you'll find a code snippet where pointers to <strong>nonvirtual</strong> member functions, <code>foo()</code> and <code>foo1()</code>, are exchanged between one base object <code>a</code> and a derived object <code>b</code>, without a problem.</p>
  
  <p>What cannot be done is the overloading, of any of the functions in the base, <code>foo()</code> or <code>foo1()</code>, in the derived class, for in this case the compiler will emit an error as shown below.</p>
  
  <pre><code>#include &lt;iostream&gt;
  
  class A
  {
      int i;
      public:
      A() : i(1) {}
      void foo() { std::cout &lt;&lt; i &lt;&lt; '\n'; }
      void foo1() { std::cout &lt;&lt; 2 * i &lt;&lt; '\n'; }
  };
  
  class B: public A
  {
      int j;
      public:
      B() : A(), j(2) {}
  //  void foo() { std::cout &lt;&lt; j &lt;&lt; '\n'; }
  };
  
  int main()
  {
      typedef void (A::* PMF)();
      PMF p = &amp;B::foo;    //   error C2374: 'p' redefinition, multiple initialization
                          //   if foo() is overloaded in B.
      PMF q = &amp;B::foo1;
      B b;
      (b.*p)();
      (b.*q)();
  
      A a;
      (a.*p)();
      (a.*q)();
  }
  </code></pre>