assigning a child class its parent

Hi

I have a class hierarchy as follows:
A (parent)->B(child)


I create an object A. A a=new A();

Somewhere, later in the code, I want to create an object B, called b, and want to specifically assign the object a as its parent. Is there a way to do this in C++?

Normally, I would do something like this:
B b=new B();

B's constructor would make a call to A's constructor
B::B()
:A(){
}

But if i have a parent object already instantiated, is there a way to assign that particular object as a child object's parent at the time the child is instantiated?

thanks
LuckyLucksAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

jkrCommented:
There seems to be a misconception. A statement like

B::B()
:A(){
}

Open in new window


only a base class' constructor. That is not related to storing a reference to a specific instance to the base class. If you want to create a relation between two instances of A and B, pass an instance of A to one of B's constructors, e.g.

class B {

public:

  // default constructor
  B() : parent(A()) {
  }
  // constructor that implicitly takes an instance of 'A'
  B(A& a) : parent(a) {
  }

private:

  A& parent;
};

Open in new window


If you need to have to option to instantiate B without a parent, you have to use pointers, since references can't be 'NULL', e.g. like

class B {

public:

  // default constructor
  B() : parent(NULL) {
  }
  // constructor that implicitly takes an instance of 'A'
  B(A* a) : parent(a) {
  }

private:

  A* parent;
};

Open in new window

0
LuckyLucksAuthor Commented:
In the solution you gave, A and B do not have a base class-derived class relationship. B just keeps a member variable of A.


 B cannot use a function defined in A as would be possible using rules of inheritance (searching the parent class when child class does not have that function).

I am looking for a way where B can be a derived class of A , but as A is already instantiated in earlier code, if i can get an association with that particular instance of A.
0
jkrCommented:
Sorry, but that's easy to remedy, i.e.

class B : public A {

public:

  // default constructor
  B() : A(), parent(A()) {
  }
  // constructor that implicitly takes an instance of 'A'
  B(A& a) : A(), parent(a) {
  }

private:

  A& parent;
};
                                            

Open in new window


or

class B : public A {

public:

  // default constructor
  B() : A(), parent(NULL) {
  }
  // constructor that implicitly takes an instance of 'A'
  B(A* a) : A(), parent(a) {
  }

private:

  A* parent;
};
                                            

Open in new window


respectively.
0
sarabandeCommented:
a base-derived relation is not the same as a parent-child relation. it is actually a totally different relation which could not be matched.

the problem is that if B is derived from A, the B object "IS A" A object as well cause a part of the B object is made up by the A. So, if you have two B objects both have a different A object and never the same. The only exception to that is if you derive B and C from A and derive D from both B and C public virtual, the A base was shared by both the B and C (diamond inheritage). but even that is not a parent relation.

a parent relation means that a 'master' object contains  two or more objects of a 'detail' class. it always means that it were two different classes which were not derived. the parent relation could be defined by using an array or container where the child objects were stored. By deriving the child classes from same base class you even could hold a container of baseclass pointers of the children for virtual use such that the parent could hold different classes. another approach is to have a reference to the parent in the child classes (c++ reference or pointer reference) as shown by jkr. note, you would not derive from parent as it makes no sense to have the parent as part of the class itself.

note, you could make the parent class friend of the child class(es) to have access to their private or protected members. but that is a bad design as it is a violation of the encapsulating principle. each class should care for its own data and you neither should directly access members of the parent by the child nor vice versa.

Sara
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.