Storing base and derived classes in a vector???

H

H

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.birth();
}

return 0;
}

Output::
Gave birth to an animal
Gave birth to an animal
Gave birth to an animal
 
V

Victor Bazarov

H said:
[..] 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
 
T

Tim Love

H said:
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->birth();
}
return 0;
}
 
H

H

Victor said:
H said:
[..] 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
 
T

terminator

H said:
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->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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top