my $base=new BaseClass(); $base->baseMethod1(); $base->baseMethod2(); my $sub1=new SubClass1(); $sub1->baseMethod1(); $sub1->baseMethod2(); $sub1->subMethodA(); my $sub1=new SubClass2(); $sub1->baseMethod1(); $sub1->baseMethod2(); $sub1->subMethodB(); package BaseClass; sub new { my $class=shift; my $self={}; bless $self, $class; return $self; } sub baseMethod1 { my $self=shift; print "baseMethod1 in BaseClass\n"; return $self; } sub baseMethod2 { my $self=shift; print "baseMethod2 in BaseClass, expected to be overridden\n"; return $self; } package SubClass1; use base qw(BaseClass); sub new { my $class=shift; my $self={}; bless $self, $class; return $self; } sub subMethodA { my $self=shift; print "subMethodA, new method in SubClass1\n"; } sub baseMethod2 { my $self=shift; print "baseMethod2 has been overriden by SubClass1\n"; } package SubClass2; use base qw(BaseClass); sub new { my $class=shift; my $self={}; bless $self, $class; return $self; } sub subMethodB { my $self=shift; print "subMethodB, new method in SubClass2\n"; } sub baseMethod2 { my $self=shift; print "baseMethod2 base been overriden by SubClass1\n"; }