안녕! 누구든지 아래 코드에서 "chug(derlist);
"줄을 어떻게 만들 수 있는지 알고 있습니까?C++ : 기본 클래스의 컨테이너를 기대하는 함수에 파생 클래스의 컨테이너를 전달하려면 어떻게해야합니까?
#include <iostream>
#include <list>
using namespace std;
class Base
{
public:
virtual void chug() { cout << "Base chug\n"; }
};
class Derived : public Base
{
public:
virtual void chug() { cout << "Derived chug\n"; }
void foo() { cout << "Derived foo\n"; }
};
void chug(list<Base*>& alist)
{
for (list<Base*>::iterator i = alist.begin(), z = alist.end(); i != z; ++i)
(*i)->chug();
}
int main()
{
list<Base*> baselist;
list<Derived*> derlist;
baselist.push_back(new Base);
baselist.push_back(new Base);
derlist.push_back(new Derived);
derlist.push_back(new Derived);
chug(baselist);
// chug(derlist); // How do I make this work?
return 0;
}
나는이 기본적으로 필요로하는 이유는, 내가 만 복잡한 객체에 대한 하나 또는 두 개의 가상 함수를 걱정 특정 기능에 전달해야 매우 복잡한 객체의 컨테이너가 있습니다.
짧은 답변은 "할 수 없다"는 것을 알고 있습니다. 사람들이이 문제를 해결하기 위해 사용하는 속임수/숙어를 찾고 있습니다.
미리 감사드립니다.
안녕하세요, Terry, 더 정확한 답변을 드리겠습니다. 내가 아래에 아무것도 모르겠어 함께 갈거야 은) ((목록 :: 반복자 I = alist.begin에 대한 \t 템플릿 \t 무효 칙칙 푹푹하는 소리 (목록 및 alist) \t { \t을 컴파일 버전입니다 , z = alist.end(); i!= z; ++ i) \t (* i) -> chug(); \t} 그리고 작동합니다. 다형성이 아니기 때문에 완벽한 해결책은 아니지만 필요한만큼 효과적입니다. Base에서 파생 된 사람이 추가 코드를 작성하지 않아도되는 다른 솔루션은 생각할 수 없습니다. –
Kyle