2017-12-19 19 views
1

"YXX"를 반환하는 다음 코드가 있습니다. 두 번째 인쇄물에 'X'가 표시되는 이유를 알고 싶습니다. 반면에 virtual 키 워드가 클래스 X에 사용되었습니다. 따라서 tab[0] = y1 줄은 Y 객체로 tab [0]으로 설정되고 'Y'로 표시됩니다. 가상 메서드가 아닌가요?가상 메서드를 사용하는 특별한 경우

#include <iostream> 

class X { 
    public: virtual void f() const { std::cout << "X"; } 
}; 

class Y : public X { 
    void f() const { std::cout << "Y"; } 
}; 

void print(const X &x) { x.f(); } 

int main() { 
    X tab[2]; 
    Y y1; 
    tab[0] = y1; 

    print(y1); 
    print(tab[0]); 
    print(tab[1]); 
    std::cout << std::endl; 
} 
+0

를 인쇄 할 것이다. –

+0

포인터를 사용할 필요가 –

+0

다형성의 경우 기본 클래스에 대한 포인터 또는 참조가 필요하며 하위 클래스를 가리 키도록 초기화됩니다. 함수를 재정의 할 때 ['override'] (http://en.cppreference.com/w/cpp/language/override)를 사용하는 것이 좋습니다. –

답변

2

탭 X 오브젝트의 배열이며, 그래서 탭의 요소에 Y 객체를 할당 할 때의 Y의 일부를 분할하고이 단지 X 부에 남겨진다. 당신이 그것을 변경 한 경우

이제 :

X * tab[2]; 
tab[0] = new X; 
tab[1] = new Y; 
print(*tab[0]); 
print(*tab[1]); 

그것은 어떤 슬라이스하지 않을 것이다 그리고 XY

당신은 객체 슬라이스를 검색