in reply to [SOLVED]: Trying to understand method calling in OOP

Ok, in your case, because the Cow class has its own speak() method, this line:

Animal::speak('Cow');

...is actually not being called, the one in Cow is instead.

Now, if you comment out or otherwise remove the Cow->speak() method from the Cow class, what will happen is, when you call Cow->speak(), that method will not be found, and since you are inheriting from Animal, Animal->speak() will be looked up instead, and if found, it'll call it, sending in the Cow class as the parameter to the inherited Animal->speak(). Observe:

use warnings; use strict; package Animal; { sub speak { my ($class) = @_; if ($class eq 'Cow'){ print "$class says moooo!\n"; } } sub run { my ($class) = @_; print "$class is running away!\n"; } } package Cow; { our @ISA = qw(Animal); } package Rooster; { our @ISA = qw(Animal); } package main; Cow->speak; Rooster->run;

Output:

Cow says moooo! Rooster is running away!

Replies are listed 'Best First'.
Re^2: Trying to understand method calling in OOP
by haukex (Archbishop) on May 09, 2018 at 11:00 UTC
    because the Cow class has its own speak() method

    Did the OP edit the question? Because at the moment the only speak() I see is in Animal...

      I did not change the question. Just updated the subject line to mark it as SOLVED. I do that for my reference as I am almost sure I'll come back at least once with similar/same question and then I'll have my answer with a confirmation i.e. SOLVED :-)