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