Question

Inheritance Question

Asked by: jacksonrf

I'm going to try and dumb this question down a little:


Essentially, I have 3 classes -- two derived classes and a base class that contains mutual member functions.  


viz.

     BaseClass
            /\    
           /  \
          /    \
Derived1  Derived2



The problem is that I would like to instantiate the derived class(es) as such:

   
    BaseClass *MyClass;
    if (SomeCondition)
    {
       MyClass = new Derived1;
    }
    else
    {
       MyClass = new Derived2;
    }
    MyClass->DoFunction1;
    MyClass->DoFunction2;
    MyClass->DoFunction3;


...And utilize "MyClass" in such a way that it remains generic -- moreover, "MyClass" will execute (overridden) functions that are either of type "Derived1" or "Derived2" depending on the "SomeCondition" above.

Sounds like a simple implementation of class inheritance?  Here's where it gets complicated:  Derived1 and Derived2 need to look exactly like BaseClass in order for BaseClasses virtual functions to be overridden.  Fine.  But Derived1 and Derived2 have their own specialized functions, which shouldn't necessarily be declared in the interface for BaseClass.  But wait, in order to keep the "MyClass" variable generic, we cannot have this kind of specialization without including it in BaseClasses interface -- thus the specialization is destroyed.  Assume that all of the functions for Derived1 and Derived2 are now included in the interface for BaseClass (which is mandatory, since Derived1 and Derived2 must look like BaseClass) and we try to hide Derived1's specialized functions from Derived2 and vise-versa.  We can try to accomplish this by declaring the functions "private".  But wait, if we use the MyClass variable, it still has access to the "private parts" -- the only way to hide them is to create classes that inherit from Derived1 and Derived2, and then instantiate these descendents.

Question:  Can I keep "MyClass" generic and still have specialized functions that are unique to Derived1 or Derived2.  Is there some other methodology that is superior, without all of the "duct tape" ?

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2000-10-04 at 07:18:36ID11456438
Tags

class

,

inherit

Topic

C++ Programming Language

Participating Experts
5
Points
100
Comments
7

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Chained Inheritance -- overriding and inherited
    This should be simple question...am in the middle of redesigning some classes using a newly designed base class. My question: My base class is derived from TGraphicControl (I'm designing a component base class for designing components of similar, yet extended, functionality...
  2. inheritance
    How can I use superclass method that is inherited as virtul in subclass. So I like to use superclass implementation from the subclass. class super{ private: public: virtual dosomething(); } class subclass:public superclass { public: private: dosomething(); }
  3. Inheritance in Delphi
    Hey guys, I am building a tottally new protect and I want strict inheritance and OOP use...I've got a problem... ;-) If I have a type record...and I want that type record to be inherited to other classes..its data that most classes need..BUT I want to be able to avoid using...
  4. inheritance
    Hi guys...my question is simple. Suppose you have two classes X and Y. If Y is derived from X and the two have exactly the same constructor (i.e same argument list), do you still have to include the base class constructor in the parameter list of the derived class constructor...
  5. Inheritance......................
    Hi, How can I set up my class so it won't be inherited from? How can I set up my member function so it won't be overridden in a derived class?

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: imladrisPosted on 2000-10-04 at 07:52:49ID: 4576954

There are two kinds of possibilities in inheritance. One is that the base contains code common to various derived classes. The point of inheritance here is to factor out common code, thus (hopefully) making it easier to maintain the program. The second kind of desire is to have objects that present a common kind of "interface", but behave somewhat differently based on what they are representing.

It seems from your description that the second case is, at least partly, your aim. However, given the need to specialize the derived classes, some extra work is needed. I would probably (not knowing the details of the problem) approach it by using casting. Put all the actual common code in the base class and the specialized code in the derived classes. Now, whenever you access a "common" method (hopefully the majority of the time), you simply use the MyClass pointer to do that. In the odd case where you need the specialized function of the derived class, you are presumably in code that knows, or is in a position to find out, whether MyClass really represents Derived1 or Derived2. With that information you can access the specialized method by casting MyClass to Derived1 (or 2) and accessing the method.

Having said all that, it would still be worth considering whether it is possible to do things in such a way that it can all go "through" BaseClass. Is there some way of creating a common abstraction of the needed specializations? That would, obviously, be better.

 

by: captainkirkPosted on 2000-10-04 at 07:59:52ID: 4577201

You can have derived classes that contain member functions and data that do not show up in the base class --- alot of this kind of thing is very common - it is the way to extend the functionality of a base class. Windows controls base classes are often extended in this fashion, for example.


Take this esample:

class BaseClass{
public:
     BaseClass();
     virtual ~BaseClass();
 
     void SomeFunction1();
     void SomeFunction2();
} // end BaseClass


class DerivedClass : public BaseClass
{
public:
     DerivedClass();
     virtual ~DerivedClass();

    void SomeFunction3();
    void SomeFunction4();
} // end DerivedClass



DerivedClass ingerits all the functionality of BaseClass (SoneFunction1() and SomeFunction2()) , plus adds a couple of functions to boot, effectively extending the capability of BaseClass......


In other words, you don't need to "back insert" functions/data that belong in the derived class(es) into your base class at all.

 

by: nietodPosted on 2000-10-04 at 08:03:44ID: 4577342

>>  But Derived1 and Derived2 have their own specialized
>> functions, which shouldn't necessarily be declared in
>> the interface for BaseClass.  But wait, in order to keep the
>> "MyClass" variable generic, we cannot have this kind of
>> specialization without including it in BaseClasses
>> interface -- thus the specialization is destroyed.
Ther appears to be a flwo in your thinking exposed here.

A derived class can have "specializations" in two ways.  First is can override  virtual functions.  This allows the class to have the same interface of the base class (or a portion of the intefrace), but still have different behavior than the base class.  This is called polymorhphism.  Second it can add new functions to the derived class that are not declared in the base class.  This is legal and this seems to be something you don't wish to do, but I'm not sure why.  

 

by: alex_rPosted on 2000-10-04 at 08:26:39ID: 4577999

jacksonrf, you can try this:

BaseClass *MyClass;
.....
.....
if (Derived1* p1 = dynamic_cast<Derived1*> MyClass) {
  p1->Derived1SpecificFunctionA();
  p1->Derived1SpecificFunctionB();
  ...
}
if (Derived2* p2 = dynamic_cast<Derived2*> MyClass) {
  p2->Derived2SpecificFunctionA();
  p2->Derived2SpecificFunctionB();
  ...
}

 

by: alex_rPosted on 2000-10-04 at 08:30:36ID: 4578119

.. and replace "MyClass" to "(MyClass)"

 

by: LucHoltkampPosted on 2000-10-04 at 08:47:51ID: 4578541

Correct me if I'm wrong, but if I got things right you want to access the extra functionality of the derived class through the base class.
This is normally done with casting.
So, if you have a baseclass that defines a certain interface that is implemented in the derived classes, you use polymorfism. If, in some case, you want to adress derived functionality that is not covered by the base class interface, you're actually in a piece of code that knows about your derived class and its functionality (its interface), so it's good design to cast then using dynamic_cast.

For instance:

struct A
{
   virtual void f(); // interface
};
struct B : public A
{
 virtual void f(); // polymorfic implementation of interface
 void g();           // extra functionality
};

void knows_about_B(A *a)
{
   B *b = dynamic_cast<B*>(a);
   if (!b) return; // not a B class
   b->g();           // use extra functionality of B
}

You could do this more generic using a Visitor, the idea is that you use a separate class that implements the functionality and give the base class a interface to accept Visitors.
Than you can easily give a baseclass pointer a Visitor to perform a certain action (f() or g()), but only the derived class recognises the Visitor for functionality g()

For instance:

struct A
{
  friend Visitor;
  bool visit(Visitor& v) { return v(this); }; // returns false if action could not be preformed
protected:
  virtual  void f();
};

struct B : public A
{
protected:
  void f();
  virtual void g();
}

struct Visitor
{
   virtual bool operator()(A* a);
}

struct Do_f : public Visitor
{
  bool operator()(A*a) { a->f(); return true; }  
}

struct Do_g : public Visitor
{
  bool operator()(A*a)
  {
     B* b = dynamic_cast<B*>(a);
     if (!b) return false;
     b->g();
}

void some_function(A*a) { a->visit(Do_g()); }

Luc

 

by: jacksonrfPosted on 2000-10-04 at 10:31:58ID: 4580699

Luc,

Thanx for the reply -- that was what I was driving at.  Though, I'm trying to stay away from down-casting, and I haven't tried using friends yet.  (I'm actually borrowing a co-worker's terminal because I am currently without Internet access.  My email is wildingcd@corning.com if you have any revelations that you would like to forward to me).  

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...