You may also want to change how a behavior in the base class works by redefining it in your derived class. Authorizing, billing, and crediting are very different processes, depending on what type of payment you are talking about.
While the Payment class can provide minimal functionality that is common across all of the various payment types, a derived class still needs to redefine or most likely extend the base class implementation. This process is called overriding.
You might also want to provide another way to initialize the object. Currently, the account number is passed directly to New. In the real world, the constructor would probably take a customer ID and a payment ID of some kind, and the card number would be retrieved from a database (where it was stored encrypted). You could add an additional constructor to do this. Providing more than one way to do the same thing with an object is called overloading. Overloaded functions have the same name but different arguments to distinguish them from one another.
The power of inheritance is not apparent until polymorphism is brought into the picture. In fact, the two concepts go hand in hand, so much so that discussing one without the other is very difficult.
The word polymorphism means "many forms." Polymorphism allows a derived class to be passed to a method that expects a base class. It allows methods from a base class to be redefined in a derived class. It also allows methods to be declared with the ...