I was extremely surprised to see the following work. If you have a set of classes that extend each other, and you create a container for them using the base class pointer, how is it able to properly call all associated destructors?
#include <iostream>
#include <string>
#include <vector>
class A {
    public:
        A(){
            std::cout << "Constructor A is called\n";    
        }
        virtual ~A(){
            std::cout << "Destructor A is called\n";    
        }
};
class B {
    public:
        B(){
            std::cout << "Constructor B is called\n";    
        }
        virtual ~B(){
            std::cout << "Destructor B is called\n";    
        }
};
class C : public A, public B {
    public:
        C(){
            std::cout << "Constructor C is called\n";    
        }
        ~C(){
            std::cout << "Destructor C is called\n";    
        }
};
int main()
{
    std::vector<A*> objects;
    C *c = new C();
    objects.push_back(c);
    for(size_t i = 0; i < objects.size(); i++){
        delete objects[i];
    }
}
I would have expected only A's destructor to be called..!
Constructor A is called
Constructor B is called
Constructor C is called
Destructor C is called
Destructor B is called
Destructor A is called
 
    