2011-12-16 4 views
0

다음 코드가 있습니다. foo (A a)를 수정하는 방법이 있는지 궁금해서 아래 코드에 주석을 달아 결과를 얻었습니다. 오버로드하지 마십시오.함수 매개 변수, 다형성

class A { 
    public: virtual void print() { std::cout << "A\n"; } }; 
class B : public A { 
    public: virtual void print() { std:cout << "B\n"; } 
}; 

void foo(A a) { a.print(); } // How to modify this, so it chooses to use B's print()? 
// void foo(B a) { a.print(); } // now, this would work! 

int main(void) { 
    A a; 
    foo(a); // prints A 
    B b; 
    foo(b); // prints A, but I want it to print B 
} 

이것은 모두 가능합니까? 그렇지 않다면, 왜?

답변

5

참조를 통해 인수를 가져와야합니다 (포인터는 필요하지 않지만 여기에서는 포인터가 필요하지 않습니다). 그렇지 않으면 객체가 분리됩니다.

void foo(A& a) { a.print(); } 
+0

어리석은 인간의 확인이 늦어서 ... –

+0

나는 그 문제를 잘라내 는가, 아니면 복사본이 만들어 졌는지 궁금하다. –

+0

인쇄는 아마도 const 메소드이어야하고 foo는 const 참조를 받아 들일 수 있습니다. [Zaviour의 이익을 위해] –