Suppose I have a class with a virtual function and a derived class that implements the virtual function in a different way. Suppose I also have a vector of the base class used to store derived classes. How would I execute the virtual function of a derived class in the vector without knowing in advance what the derived class is? Minimal code that illustrates the problem:
#include <iostream>
#include <vector>
class Foo {
public:
virtual void do_stuff (void) {
std::cout << "Foo\n";
}
};
class Bar: public Foo {
public:
void do_stuff (void) {
std::cout << "Bar\n";
}
};
int main (void) {
std::vector <Foo> foo_vector;
Bar bar;
foo_vector.resize (1);
foo_vector [0] = bar;
bar.do_stuff (); /* prints Bar */
foo_vector [0].do_stuff (); /* prints Foo; should print Bar */
return 0;
}
You can't. The objects in the vector will have been sliced -- any derived-class instance data will have been chopped off, so calling the method would be a super-bad idea.
If, on the other hand, you have a vector of pointers to base, then you simply call the virtual method, and the derived-class version will be invoked.
The class that you are actually calling is not a class of Bar, but instead a class of Foo. What you are doing at foo_vector [0] = bar;
is a call of the implicit operator= which is doing its best to make something smart happen. The memory space is still the size of a Foo though, so it can't ever be a Bar.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With