in reply to Inheritance strangeness

The mistake is simple. Bar::foo() just tries to call the function foo() from package Bar. If you want to call an inherited method, you must use the class method call: Bar->foo()

Replies are listed 'Best First'.
Re^2: Inheritance strangeness
by cleverett (Friar) on Sep 08, 2004 at 07:52 UTC
    Change test.pl to
    #!/usr/bin/perl require 'C.pm'; C->foo();
    and you get:

    55. perl test.pl
    Can't locate object method "foo" via package "C" at test.pl line 5.

      Watch for the bold
      C:\e>echo package A;sub foo{666};1; >A.pm
      
      C:\e>echo package B;use base 'A';1; >B.pm
      
      C:\e>echo package C;use base 'B';1; >C.pm
      
      C:\e>perl -e"require 'C.pm';die C->foo()"
      Can't locate object method "foo" via package "C" at -e line 1.
      
      
      C:\e>perl -le"require 'C.pm';print for %INC"
      XSLoader.pm
      C:/Perl/lib/XSLoader.pm
      Carp.pm
      C:/Perl/lib/Carp.pm
      warnings/register.pm
      C:/Perl/lib/warnings/register.pm
      Exporter.pm
      C:/Perl/lib/Exporter.pm
      vars.pm
      C:/Perl/lib/vars.pm
      strict.pm
      C:/Perl/lib/strict.pm
      C.pm
      C.pm
      warnings.pm
      C:/Perl/lib/warnings.pm
      base.pm
      C:/Perl/lib/base.pm
      B.pm
      C:/Perl/lib/B.pm
      
      C:\e>

      MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
      I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
      ** The third rule of perl club is a statement of fact: pod is sexy.

      This does what you'd expect:

      use C; C->foo();

      Update: In my test code, I had a use lib "[directory with A.pm, B.pm, C.pm]" before use C;. That means I explicitly got the new B.pm instead of the system one. Everyone else is right that if you're picking up the system B.pm first, that's a problem.