[완료]stl의 remove_if가 virtual function을 먹지 않습니다.

sell의 이미지

#include <iostream>
#include <list>
using namespace std;
// a predicate implemented as a class:
class is_base
{
	public:
		virtual bool operator() (const int& value) { return true; }
};
class is_even : public is_base
{
	public:
		virtual bool operator() (const int& value) {return (value%2)==0; }
};
 
int main ()
{
	int myints[]= {1,2,3,4,5,6,7,8, 9, 10, 11, 12, 13,14, 15,16, 17, 18};
	list<int> mylist (myints,myints+18);
 
	is_base*		pt_base = new is_even;
 
	mylist.remove_if (*pt_base);
 
	cout << "mylist contains:";
	for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
	cout << " " << *it;
	cout << endl;
 
	return 0;
}

제 생각이 이렇게 하면 is_even의 operator()가 실행되서 even이 지워져 홀수만 남아있어야 할 것 같은데,
자꾸 is_base의 ()가 실행되서 다 지워지네요.

문제가 뭐죠?

netionics의 이미지

netionics의 이미지

kukyakya의 이미지

void remove_if(is_base p); 형태의 함수가 생성되서 실행되기 때문입니다.

mylist.remove_if<is_base&>(*pt_base);로 레퍼런스를 인자로 받는 함수로 명시화해서 실행시키면 의도하신대로 돌아갈거예요.