Inheritance in COBOL is a fundamental object-oriented programming concept that allows a class (subclass or child class) to inherit methods and data from another class (superclass or parent class). Inheritance enables code reuse by allowing subclasses to automatically have access to all public and protected methods and properties of their parent class, while also allowing them to add new functionality or override inherited methods. Understanding inheritance is essential for building maintainable, reusable object-oriented COBOL applications and creating well-structured class hierarchies.
Inheritance is an object-oriented programming mechanism that establishes an "is-a" relationship between classes. When a class inherits from another class, it automatically receives (inherits) all the methods and instance data from the parent class. The subclass can then:
Inheritance promotes code reuse, reduces duplication, and enables you to build upon existing functionality rather than rewriting it. It also enables polymorphism, where methods can be called through parent class references but execute subclass-specific implementations.
In COBOL, inheritance is specified using the INHERITS clause (or INHERITS FROM clause, depending on your compiler) in the CLASS-ID paragraph. The syntax is:
12345CLASS-ID child-class-name INHERITS FROM parent-class-name [FACTORY] [OBJECT] END CLASS child-class-name.
The INHERITS clause must appear immediately after the class name in the CLASS-ID paragraph. Once specified, the child class automatically inherits all methods and instance data from the parent class.
Let's look at a basic example showing a parent class and a child class:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586*> Parent class CLASS-ID EMPLOYEE FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMPLOYEE-ID PIC X(10). 01 EMPLOYEE-NAME PIC X(50). 01 EMPLOYEE-SALARY PIC 9(8)V99. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID SET-EMPLOYEE-DATA. DATA DIVISION. LINKAGE SECTION. 01 ID PIC X(10). 01 NAME PIC X(50). 01 SALARY PIC 9(8)V99. PROCEDURE DIVISION USING ID, NAME, SALARY. MOVE ID TO EMPLOYEE-ID MOVE NAME TO EMPLOYEE-NAME MOVE SALARY TO EMPLOYEE-SALARY EXIT METHOD. END METHOD SET-EMPLOYEE-DATA. METHOD-ID GET-EMPLOYEE-INFO. DATA DIVISION. LINKAGE SECTION. 01 INFO PIC X(100). PROCEDURE DIVISION RETURNING INFO. STRING EMPLOYEE-ID DELIMITED BY SPACE ' - ' DELIMITED BY SIZE EMPLOYEE-NAME DELIMITED BY SPACE ' - $' DELIMITED BY SIZE EMPLOYEE-SALARY DELIMITED BY SIZE INTO INFO EXIT METHOD. END METHOD GET-EMPLOYEE-INFO. END CLASS EMPLOYEE. *> Child class inheriting from EMPLOYEE CLASS-ID MANAGER INHERITS FROM EMPLOYEE FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 DEPARTMENT PIC X(30). 01 TEAM-SIZE PIC 9(3). OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID SET-MANAGER-DATA. DATA DIVISION. LINKAGE SECTION. 01 DEPT PIC X(30). 01 TEAM-COUNT PIC 9(3). PROCEDURE DIVISION USING DEPT, TEAM-COUNT. MOVE DEPT TO DEPARTMENT MOVE TEAM-COUNT TO TEAM-SIZE EXIT METHOD. END METHOD SET-MANAGER-DATA. METHOD-ID GET-MANAGER-INFO. DATA DIVISION. LINKAGE SECTION. 01 MANAGER-INFO PIC X(150). 01 EMPLOYEE-INFO PIC X(100). PROCEDURE DIVISION RETURNING MANAGER-INFO. *> Call inherited method from parent class INVOKE SELF "GET-EMPLOYEE-INFO" RETURNING EMPLOYEE-INFO STRING EMPLOYEE-INFO DELIMITED BY SIZE ' - Dept: ' DELIMITED BY SIZE DEPARTMENT DELIMITED BY SPACE ' - Team: ' DELIMITED BY SIZE TEAM-SIZE DELIMITED BY SIZE INTO MANAGER-INFO EXIT METHOD. END METHOD GET-MANAGER-INFO. END CLASS MANAGER.
In this example:
COBOL supports only single inheritance, meaning each class can inherit from exactly one parent class. This is similar to Java and C#, but different from languages like C++ that support multiple inheritance (where a class can inherit from multiple parents).
Single inheritance simplifies the language and avoids the complexity and ambiguity issues that can arise with multiple inheritance, such as:
Here's an example showing a chain of single inheritance:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586*> Base class CLASS-ID VEHICLE FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 VEHICLE-ID PIC X(10). 01 VEHICLE-MAKE PIC X(20). 01 VEHICLE-MODEL PIC X(30). OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID GET-VEHICLE-INFO. DATA DIVISION. LINKAGE SECTION. 01 INFO PIC X(100). PROCEDURE DIVISION RETURNING INFO. STRING VEHICLE-MAKE DELIMITED BY SPACE ' ' DELIMITED BY SIZE VEHICLE-MODEL DELIMITED BY SPACE INTO INFO EXIT METHOD. END METHOD GET-VEHICLE-INFO. END CLASS VEHICLE. *> First level of inheritance CLASS-ID CAR INHERITS FROM VEHICLE FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUMBER-OF-DOORS PIC 9(1). OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID GET-CAR-INFO. DATA DIVISION. LINKAGE SECTION. 01 CAR-INFO PIC X(120). 01 VEHICLE-INFO PIC X(100). PROCEDURE DIVISION RETURNING CAR-INFO. INVOKE SELF "GET-VEHICLE-INFO" RETURNING VEHICLE-INFO STRING VEHICLE-INFO DELIMITED BY SIZE ' - Doors: ' DELIMITED BY SIZE NUMBER-OF-DOORS DELIMITED BY SIZE INTO CAR-INFO EXIT METHOD. END METHOD GET-CAR-INFO. END CLASS CAR. *> Second level of inheritance CLASS-ID SEDAN INHERITS FROM CAR FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 TRUNK-CAPACITY PIC 9(4). OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID GET-SEDAN-INFO. DATA DIVISION. LINKAGE SECTION. 01 SEDAN-INFO PIC X(150). 01 CAR-INFO PIC X(120). PROCEDURE DIVISION RETURNING SEDAN-INFO. INVOKE SELF "GET-CAR-INFO" RETURNING CAR-INFO STRING CAR-INFO DELIMITED BY SIZE ' - Trunk: ' DELIMITED BY SIZE TRUNK-CAPACITY DELIMITED BY SIZE ' cu ft' DELIMITED BY SIZE INTO SEDAN-INFO EXIT METHOD. END METHOD GET-SEDAN-INFO. END CLASS SEDAN.
In this example:
Method overriding occurs when a subclass provides its own implementation of a method that was already defined in the parent class. The overridden method must have the same name and parameter signature as the parent method.
To override a method, you simply define a method with the same name and signature in the subclass. Some COBOL compilers support an explicit OVERRIDE keyword in the METHOD-ID clause:
1234567891011121314151617181920212223242526272829303132*> Parent class CLASS-ID ANIMAL FACTORY. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID MAKE-SOUND. PROCEDURE DIVISION. DISPLAY "Some animal sound" EXIT METHOD. END METHOD MAKE-SOUND. END CLASS ANIMAL. *> Child class overriding the method CLASS-ID DOG INHERITS FROM ANIMAL FACTORY. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID MAKE-SOUND OVERRIDE. PROCEDURE DIVISION. DISPLAY "Woof! Woof!" EXIT METHOD. END METHOD MAKE-SOUND. END CLASS DOG.
When MAKE-SOUND is called on a DOG instance, it executes the DOG version, not the ANIMAL version. The OVERRIDE keyword (if supported) makes the intention explicit and helps catch errors if the method signature doesn't match the parent.
Often, you want to extend the parent method's behavior rather than completely replace it. The SUPER reference allows you to call the parent class version of a method:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455*> Parent class CLASS-ID ACCOUNT FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 ACCOUNT-BALANCE PIC 9(8)V99 VALUE ZERO. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID CALCULATE-INTEREST. DATA DIVISION. LINKAGE SECTION. 01 INTEREST-RATE PIC 9(2)V99. 01 INTEREST-AMOUNT PIC 9(8)V99. PROCEDURE DIVISION USING INTEREST-RATE RETURNING INTEREST-AMOUNT. COMPUTE INTEREST-AMOUNT = ACCOUNT-BALANCE * INTEREST-RATE / 100 EXIT METHOD. END METHOD CALCULATE-INTEREST. END CLASS ACCOUNT. *> Child class extending parent behavior CLASS-ID SAVINGS-ACCOUNT INHERITS FROM ACCOUNT FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 BONUS-RATE PIC 9(2)V99 VALUE 0.5. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID CALCULATE-INTEREST OVERRIDE. DATA DIVISION. LINKAGE SECTION. 01 INTEREST-RATE PIC 9(2)V99. 01 INTEREST-AMOUNT PIC 9(8)V99. 01 BASE-INTEREST PIC 9(8)V99. PROCEDURE DIVISION USING INTEREST-RATE RETURNING INTEREST-AMOUNT. *> Call parent method to get base interest INVOKE SUPER "CALCULATE-INTEREST" USING INTEREST-RATE RETURNING BASE-INTEREST *> Add bonus interest COMPUTE INTEREST-AMOUNT = BASE-INTEREST + (BASE-INTEREST * BONUS-RATE / 100) EXIT METHOD. END METHOD CALCULATE-INTEREST. END CLASS SAVINGS-ACCOUNT.
In this example:
In COBOL, instance data (data defined in the WORKING-STORAGE SECTION within the OBJECT paragraph) is typically private to the class where it is defined. This means a subclass cannot directly access instance data from its parent class.
If a subclass needs to access or modify parent class data, it must do so through public methods (getters and setters) provided by the parent class. This maintains proper encapsulation and data integrity.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687*> Parent class with private data CLASS-ID PERSON FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 PERSON-NAME PIC X(50). 01 PERSON-AGE PIC 9(3). OBJECT SECTION. PROCEDURE DIVISION. *> Getter methods to access private data METHOD-ID GET-NAME. DATA DIVISION. LINKAGE SECTION. 01 NAME PIC X(50). PROCEDURE DIVISION RETURNING NAME. MOVE PERSON-NAME TO NAME EXIT METHOD. END METHOD GET-NAME. METHOD-ID GET-AGE. DATA DIVISION. LINKAGE SECTION. 01 AGE PIC 9(3). PROCEDURE DIVISION RETURNING AGE. MOVE PERSON-AGE TO AGE EXIT METHOD. END METHOD GET-AGE. *> Setter methods to modify private data METHOD-ID SET-NAME. DATA DIVISION. LINKAGE SECTION. 01 NAME PIC X(50). PROCEDURE DIVISION USING NAME. MOVE NAME TO PERSON-NAME EXIT METHOD. END METHOD SET-NAME. METHOD-ID SET-AGE. DATA DIVISION. LINKAGE SECTION. 01 AGE PIC 9(3). PROCEDURE DIVISION USING AGE. MOVE AGE TO PERSON-AGE EXIT METHOD. END METHOD SET-AGE. END CLASS PERSON. *> Child class accessing parent data through methods CLASS-ID EMPLOYEE INHERITS FROM PERSON FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMPLOYEE-ID PIC X(10). OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID GET-EMPLOYEE-INFO. DATA DIVISION. LINKAGE SECTION. 01 INFO PIC X(150). 01 NAME PIC X(50). 01 AGE PIC 9(3). PROCEDURE DIVISION RETURNING INFO. *> Access parent data through inherited methods INVOKE SELF "GET-NAME" RETURNING NAME INVOKE SELF "GET-AGE" RETURNING AGE STRING EMPLOYEE-ID DELIMITED BY SPACE ' - ' DELIMITED BY SIZE NAME DELIMITED BY SPACE ' (' DELIMITED BY SIZE AGE DELIMITED BY SIZE ')' DELIMITED BY SIZE INTO INFO EXIT METHOD. END METHOD GET-EMPLOYEE-INFO. END CLASS EMPLOYEE.
In this example, EMPLOYEE cannot directly access PERSON-NAME or PERSON-AGE, but it can use the inherited GET-NAME and GET-AGE methods to retrieve the values. This maintains encapsulation while still allowing subclasses to work with parent class data.
An inheritance hierarchy is a tree-like structure of classes where each class (except the root) inherits from exactly one parent class, forming chains of inheritance. Well-designed hierarchies follow the "is-a" relationship principle, where a subclass represents a more specific type of its parent class.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576*> Base class CLASS-ID EMPLOYEE FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMP-ID PIC X(10). 01 EMP-NAME PIC X(50). 01 BASE-SALARY PIC 9(8)V99. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID CALCULATE-SALARY. DATA DIVISION. LINKAGE SECTION. 01 SALARY PIC 9(8)V99. PROCEDURE DIVISION RETURNING SALARY. MOVE BASE-SALARY TO SALARY EXIT METHOD. END METHOD CALCULATE-SALARY. END CLASS EMPLOYEE. *> First level subclass CLASS-ID MANAGER INHERITS FROM EMPLOYEE FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 BONUS-AMOUNT PIC 9(8)V99. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID CALCULATE-SALARY OVERRIDE. DATA DIVISION. LINKAGE SECTION. 01 SALARY PIC 9(8)V99. 01 BASE-SAL PIC 9(8)V99. PROCEDURE DIVISION RETURNING SALARY. INVOKE SUPER "CALCULATE-SALARY" RETURNING BASE-SAL COMPUTE SALARY = BASE-SAL + BONUS-AMOUNT EXIT METHOD. END METHOD CALCULATE-SALARY. END CLASS MANAGER. *> Second level subclass CLASS-ID SENIOR-MANAGER INHERITS FROM MANAGER FACTORY. DATA DIVISION. WORKING-STORAGE SECTION. 01 STOCK-OPTIONS PIC 9(8)V99. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID CALCULATE-SALARY OVERRIDE. DATA DIVISION. LINKAGE SECTION. 01 SALARY PIC 9(8)V99. 01 MANAGER-SAL PIC 9(8)V99. PROCEDURE DIVISION RETURNING SALARY. INVOKE SUPER "CALCULATE-SALARY" RETURNING MANAGER-SAL COMPUTE SALARY = MANAGER-SAL + STOCK-OPTIONS EXIT METHOD. END METHOD CALCULATE-SALARY. END CLASS SENIOR-MANAGER.
This hierarchy creates: EMPLOYEE → MANAGER → SENIOR-MANAGER. Each level adds more specific functionality:
Follow these best practices when using inheritance in COBOL:
The parent class defines the structure of an algorithm, and subclasses provide specific implementations:
12345678910111213141516171819202122232425262728293031323334CLASS-ID DATA-PROCESSOR FACTORY. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID PROCESS-DATA. PROCEDURE DIVISION. PERFORM VALIDATE-DATA PERFORM TRANSFORM-DATA PERFORM SAVE-DATA EXIT METHOD. END METHOD PROCESS-DATA. METHOD-ID VALIDATE-DATA. PROCEDURE DIVISION. *> Default validation - can be overridden EXIT METHOD. END METHOD VALIDATE-DATA. METHOD-ID TRANSFORM-DATA. PROCEDURE DIVISION. *> Default transformation - can be overridden EXIT METHOD. END METHOD TRANSFORM-DATA. METHOD-ID SAVE-DATA. PROCEDURE DIVISION. *> Default save - can be overridden EXIT METHOD. END METHOD SAVE-DATA. END CLASS DATA-PROCESSOR.
Subclasses specialize parent behavior by adding specific functionality:
1234567891011121314151617181920212223242526272829303132333435363738CLASS-ID PAYMENT-PROCESSOR FACTORY. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID PROCESS-PAYMENT. DATA DIVISION. LINKAGE SECTION. 01 AMOUNT PIC 9(8)V99. PROCEDURE DIVISION USING AMOUNT. *> Base payment processing EXIT METHOD. END METHOD PROCESS-PAYMENT. END CLASS PAYMENT-PROCESSOR. CLASS-ID CREDIT-CARD-PROCESSOR INHERITS FROM PAYMENT-PROCESSOR FACTORY. OBJECT SECTION. PROCEDURE DIVISION. METHOD-ID PROCESS-PAYMENT OVERRIDE. DATA DIVISION. LINKAGE SECTION. 01 AMOUNT PIC 9(8)V99. PROCEDURE DIVISION USING AMOUNT. *> Credit card specific processing INVOKE SUPER "PROCESS-PAYMENT" USING AMOUNT *> Add credit card validation, authorization, etc. EXIT METHOD. END METHOD PROCESS-PAYMENT. END CLASS CREDIT-CARD-PROCESSOR.
Think of inheritance like a family tree:
So inheritance is like getting a head start—you automatically know everything your parent knows, and then you can add your own special skills on top!
Complete these exercises to reinforce your understanding of inheritance:
Create a base SHAPE class with a method to calculate area. Then create RECTANGLE and CIRCLE classes that inherit from SHAPE and override the area calculation method with their specific formulas.
Create an EMPLOYEE base class with name and ID. Create PART-TIME-EMPLOYEE and FULL-TIME-EMPLOYEE subclasses that inherit from EMPLOYEE and add their own specific data (hours worked, salary type, etc.). Override a method to calculate pay differently for each type.
Create a VEHICLE class with a START-ENGINE method that displays "Engine starting...". Create a CAR class that inherits from VEHICLE and overrides START-ENGINE to call the parent method using SUPER, then add "Car is ready to drive!".
Create a three-level inheritance hierarchy: ANIMAL → MAMMAL → DOG. Each level should add new methods and data. Show how DOG can call methods from both MAMMAL and ANIMAL.
Create a PARENT class with private data and provide getter and setter methods. Create a CHILD class that inherits from PARENT and uses the accessor methods to work with the parent's data, demonstrating proper encapsulation.
1. How is inheritance specified in a COBOL class?
2. How many parent classes can a COBOL class inherit from?
3. What is the SUPER reference used for in COBOL inheritance?
4. What happens when a subclass defines a method with the same name as a parent class method?
5. Can a subclass directly access instance data from its parent class?
6. What is the purpose of an inheritance hierarchy?