Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Storing base and derived classes in a vector???

Reply
Thread Tools

Storing base and derived classes in a vector???

 
 
H
Guest
Posts: n/a
 
      07-16-2007
I'm trying to wrap my head around inheritance. The following code
creates three objects, an Animal, a Dog and a Cat. Dog and Cat are
derived from Animal and overwrite Animal's birth() method.

I thought, since Dog and Cat are Animals, I can make a vector of Animals
and store Dogs and Cats in it. There's no problem until I try accessing
the elements of the vector, where they are now all treated as Animals.

I suppose this makes sense, since I created a vector of Animals, that
all the elements in it should be treated as Animals. How do I store a
Dog in an Animal vector and retrieve it as a Dog? Can I even do that?

I'm not even sure of the terminology of what I'm trying to do, so my
Google searches haven't been very successful. Even a hint of what to
search for would be helpful.

Thanks,

JamesW.


#include <iostream>
#include <vector>

class animal {
public:
animal(){};
~animal(){};
virtual void birth(){
std::cout << "Gave birth to an animal" << std::endl;
}
};

class dog : public animal {
public:
void birth(){
std::cout << "Gave birth to a puppy" << std::endl;
}
};

class cat : public animal {
public:
void birth(){
std::cout << "Gave birth to a kitten" << std::endl;
}
};

int main()
{
animal thing;
dog max;
cat lucky;

std::vector<animal>list;

list.push_back(thing);
list.push_back(max);
list.push_back(lucky);

for(unsigned char i=0;i< list.size(); i++){
list[i].birth();
}

return 0;
}

Output::
Gave birth to an animal
Gave birth to an animal
Gave birth to an animal
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      07-16-2007
H wrote:
> [..] I created a vector of Animals, that
> all the elements in it should be treated as Animals. How do I store a
> Dog in an Animal vector and retrieve it as a Dog? Can I even do that?
>


No, you cannot. Read about "slicing". Then read the FAQ (#34.4 is
one I found relevant, I am sure there are others). Then read the
archives for this newsgroup (search for "vector of derived" or some
such).

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
 
 
 
Tim Love
Guest
Posts: n/a
 
      07-16-2007
H <(E-Mail Removed)> writes:

>I thought, since Dog and Cat are Animals, I can make a vector of Animals
>and store Dogs and Cats in it.

I think the trouble is that when you store them, they become animals.
Try the following, which uses std::vector<animal*>list;




#include <iostream>
#include <vector>

class animal {
public:
animal(){};
~animal(){};
virtual void birth(){
std::cout << "Gave birth to an animal" << std::endl;
}
};

class dog : public animal {
public:
void birth(){
std::cout << "Gave birth to a puppy" << std::endl;
}
};



class cat : public animal {
public:
void birth(){
std::cout << "Gave birth to a kitten" << std::endl;
}
};

int main()
{
animal thing;
dog max;
cat lucky;

std::vector<animal*>list;

list.push_back(&thing);
list.push_back(&max);
list.push_back(&lucky);

for(unsigned char i=0;i< list.size(); i++){
list[i]->birth();
}
return 0;
}
 
Reply With Quote
 
H
Guest
Posts: n/a
 
      07-16-2007
Victor Bazarov wrote:
> H wrote:
>> [..] I created a vector of Animals, that
>> all the elements in it should be treated as Animals. How do I store a
>> Dog in an Animal vector and retrieve it as a Dog? Can I even do that?
>>

>
> No, you cannot. Read about "slicing". Then read the FAQ (#34.4 is
> one I found relevant, I am sure there are others). Then read the
> archives for this newsgroup (search for "vector of derived" or some
> such).


Thanks for the hints.

JamesW
 
Reply With Quote
 
terminator
Guest
Posts: n/a
 
      07-18-2007
On Jul 16, 6:13 pm, (E-Mail Removed) (Tim Love) wrote:
> H <(E-Mail Removed)> writes:
> >I thought, since Dog and Cat are Animals, I can make a vector of Animals
> >and store Dogs and Cats in it.

>
> I think the trouble is that when you store them, they become animals.
> Try the following, which uses std::vector<animal*>list;
>
> #include <iostream>
> #include <vector>
>
> class animal {
> public:
> animal(){};
> ~animal(){};
> virtual void birth(){
> std::cout << "Gave birth to an animal" << std::endl;
> }
>
> };
>
> class dog : public animal {
> public:
> void birth(){
> std::cout << "Gave birth to a puppy" << std::endl;
> }
>
> };
>
> class cat : public animal {
> public:
> void birth(){
> std::cout << "Gave birth to a kitten" << std::endl;
> }
>
> };
>
> int main()
> {
> animal thing;
> dog max;
> cat lucky;
>
> std::vector<animal*>list;
>
> list.push_back(&thing);
> list.push_back(&max);
> list.push_back(&lucky);
>
> for(unsigned char i=0;i< list.size(); i++){
> list[i]->birth();
> }
> return 0;
>
>
>
> }- Hide quoted text -
>
> - Show quoted text -


using pointers and referrences is a good idea but you will be
responsible for garbage collection(delete pointers)so define some
smart pointer and go on.



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Derived::Derived(const Base&) and Derived& operator=(const Base&) developereo@hotmail.com C++ 1 05-23-2007 01:44 PM
Derived::Derived(const Base&) developereo@hotmail.com C++ 4 05-23-2007 09:32 AM
Derived::Derived(const Base&) and Derived& operator=(const Base&) developereo@hotmail.com C++ 1 05-23-2007 12:07 AM
Format of compiler generated derived destructor when base has 'virtual ~base() throw():" qazmlp C++ 1 04-10-2005 03:09 PM
Base Classes in .exe, derived classes in .dll Colin Goudie C++ 6 01-26-2004 03:18 PM



Advertisments