You're confusing inheritance with delegation. ErrorHandler should really be a delegate of dbCon.
One useful way of determining if a class A should be a subclass of B is to ask yourself if saying "A is a more specific kind of thing than B is." That is, does A have at least all the basic attributes and behaviors of B. An example of where this is true, and also is not:
TRUE: A cougar is a type of feline.
FALSE: A trunk is a type of car.
- FALSE: A lawyer is a type of record label executive.
In case 2, a truck is part of a car, so the correct way to model this is by composition; have a Car object that can then contain a reference to a Trunk object.
In case 3, a lawyer is a delegate of the record label executive; the correct way to model this is by having your RLExective object hold a reference to one or more Lawyers it knows, and have the RLExecutive call the SueCollegeStudentOrGrandmother() method on any one of the Lawyers when the need arises.
In your hierarchy here, you are saying that ErrorHandler is a type of dbCon. This doesn't make any sense. It would be more accurate to say that ErrorHandler is a delegate of dbCon, tasked with handling errors. In this case, you would probably want a freefloating ErrorHandler object, or maybe one with specific knowledge about DB errors. Whenever dbCon gets an error it wants to display, it throws the error over to ErrorHandler via the ShowError() method.
Based on your comment, it seems your confusion lies in the meaning of extends. By saying ErrorHandler extends dbCon, you have said that ErrorHandler is a subclass of dbCon, not that ErrorHandler adds additional functionality to dbCon. This means you would have to create an instance of ErrorHandler, which would have both the functionality of dbCon and ErrorHandler. This is probably not what you want.
Hope this made some sense.