Connecting Tech Pros Worldwide Forums | Help | Site Map

Storing base and derived classes in a vector???

H
Guest
 
Posts: n/a
#1: Jul 16 '07
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

Victor Bazarov
Guest
 
Posts: n/a
#2: Jul 16 '07

re: Storing base and derived classes in a vector???


H wrote:
Quote:
[..] 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


Tim Love
Guest
 
Posts: n/a
#3: Jul 16 '07

re: Storing base and derived classes in a vector???


H <H@r.cwrites:
Quote:
>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;
}
H
Guest
 
Posts: n/a
#4: Jul 16 '07

re: Storing base and derived classes in a vector???


Victor Bazarov wrote:
Quote:
H wrote:
Quote:
>[..] 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
terminator
Guest
 
Posts: n/a
#5: Jul 18 '07

re: Storing base and derived classes in a vector???


On Jul 16, 6:13 pm, t...@eng.cam.ac.uk (Tim Love) wrote:
Quote:
H <H...@r.cwrites:
Quote:
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.



Closed Thread