혹시
list <Parent> a;
Parent* xxx = new Child();
a.push_back(*xxx);
이렇게 쓰셨다면 이미 그 xxx는 Parent의 내용만을 가지게 됩니다.
push_back 함수 안에서는 xxx의 참조를 받아오고, 그것을 자기 안에서 새로운 Parent 를 하나 생성한 뒤
거기다가 대충 맞는 데이터를 복사합니다.
하지만 가상함수 테이블은 복사되지 않기 때문에, 이 경우에는 Parent 에 있는 함수만 사용하게 됩니다.
#include "stdafx.h"
#include <list>
class A
{
public:
virtual void AAA()
{
printf("aaa");
}
};
class B : public A
{
void AAA()
{
printf("bbb");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::list<A> aList;
aList.push_back(*(new B()));
for(std::list<A>::iterator iter = aList.begin(); iter != aList.end(); iter++)
{
(*iter).AAA();
}
system("pause");
return 0;
}
이 코드의 경우 결과는 aaa 입니다.
그리고
#include "stdafx.h"
#include <list>
class A
{
public:
virtual void AAA()
{
printf("aaa");
}
};
class B : public A
{
void AAA()
{
printf("bbb");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::list<A*> aList;
aList.push_back(new B());
for(std::list<A*>::iterator iter = aList.begin(); iter != aList.end(); iter++)
{
(*iter)->AAA();
}
system("pause");
return 0;
}
이렇게 한 경우, 결과는 bbb가 나오게 됩니다. (원하시는 작동방식으로 작동합니다)