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