2016-12-31 1 views
0

내가 추상 클래스가있는 경우,이 필드 std::string name;을 가지고 있으며,이 자식 클래스에서 재정의와 operator<<에 호출 될 virtual void print(std::ostream&) const noexcept = 0; 순수 가상 메소드를 가지고,의는 "척추"를 부르 자 .연산자 <<, C++ 추상 클래스에서

다형성이 작동하는 방식과 상속 된 클래스에서 operator<<을 구현하는 방법을 얻습니다.

내가하지 않습니다 무엇 :

이해가 안되네 : 가상 인쇄 기능을 사용하는 추상 클래스의 operator<<를 구현하는 방법. 왜이 코드가 작동하지 않습니까? 내 추상 클래스는 operator<<이어야합니다.

virtual void print(std::ostream&) const noexcept = 0; 
std::ostream & operator<<(std::ostream & str, Member &obj) 
{ 
    return obj.print(str); 
} 

이것은 추상 클래스 코드입니다.

+0

'<<'연산자. 당신은 계속 "내 클래스는 연산자가있다"라고 말하거나 "어떤 클래스에서 연산자"를 구현한다. - 정확히 무엇을 의미 하는가? 어쨌든, 하나의 비 멤버 함수'std :: ostream & operator << (std :: ostream & str, Vertebrate & obj) {obj.print (str); return str; }''Vertebrate'에서 파생 된 모든 클래스에서 작동해야합니다. 각 클래스마다 별도의 클래스가 필요하지 않습니다. –

답변

2

void 인 결과를 반환하려고 시도했지만 operator<<std::ostream을 반환해야합니다.

다음 작동한다 : 독립, 비 멤버 함수이어야 스트림 출력을 위해 사용

class Vertebrate 
{ 
    // ... 
    virtual void print(std::ostream&) const noexcept = 0; 
}; 

std::ostream& operator<<(std::ostream& stream, Vertebrate& obj) 
{ 
    obj.print(stream); 
    return stream; 
}