#include <iostream>
#include <list>
class a
{
protected:
int val;
public:
virtualvoid increment(){val++;};
void say(){std::cout << val << "\n";};
a():val(0){};
};
class b : public a
{
public:
void increment(){val+=2;};
b(){};
};
class c : public a
{
protected:
int val2;
public:
void increment(){val+=3;};
c():val2(0){};
};
int main ( int argc, char **argv )
{
std::list<a*> l;
a* aa = new a;
b* bb = new b;
c* cc = new c;
l.push_back(aa);
l.push_back(bb);
l.push_back(cc);
for(std::list<a*>::iterator c = l.begin(); c != l.end(); ++c)
{
(**c).increment();
(**c).say();
}
return 0;
}
#include <iostream>
#include <list>
class a
{
protected:
int val;
public:
virtualvoid increment(){val++;};
void say(){std::cout << val << "\n";};
a():val(0){};
};
class b : public a
{
public:
void increment(){val+=2;};
b(){};
};
class c : public a
{
protected:
int val2;
public:
void increment(){val+=3;};
c():val2(0){};
};
int main ( int argc, char **argv )
{
std::list<a> l;
a aa;
b bb;
c cc;
l.push_back(aa);
l.push_back(bb);
l.push_back(cc);
for(std::list<a>::iterator c = l.begin(); c != l.end(); ++c)
{
(*c).increment();
(*c).say();
}return 0;
}
In the second code you are storing objects of type a in the list. The list can't store objects of type b or c. When you use push_back to add aa and cc the objects will be "sliced" and only the class a part of the objects are stored in the list. Slicing is almost always a bug.
a::increment() is called for all the elements because all of them are of type a.