다음 코드가 컴파일되고 작동하는 이유를 정확히 알지 못합니다.연산자에서 순수 가상 함수 호출 <<
#include <iostream>
struct Base
{
virtual std::ostream& display(std::ostream& os) const = 0;
friend std::ostream& operator<<(std::ostream& lhs, const Base& rhs)
{
return rhs.display(lhs);
}
};
struct A: Base
{
virtual std::ostream& display(std::ostream& os) const
{
return os << "A" << std::endl;
}
};
struct B: A
{
virtual std::ostream& display(std::ostream& os) const
{
return os << "B" << std::endl;
}
};
int main()
{
A a;
std::cout << a << std::endl;
B b;
std::cout << b << std::endl;
}
나는 순수한 virtual display
함수를 호출 Base
클래스 내에서 한 번만 operator<<
을 정의하고있다. 이 스키마는 대개 파생 클래스에 operator<<
을 다시 쓰는 것을 피하기 위해 사용됩니다. 즉 기본 클래스에서 한 번만 정의한 다음 다른 함수 (예 : display()
)와 함께 가상 디스패치를 사용합니다.
내가 friend std::ostream& operator<<(...)
의 구현에 Base
클래스 내부의 순수 가상 함수를 호출 할 수 있어요 왜 Live on Coliru
당신이 설명 할 수 보는가? 나는 이것이 가능하지 않아야한다고 생각했다.
왜 가능하지 않습니까? – immibis
포인터 나 기본 클래스에 대한 참조를 통해 순수 가상 함수를 호출 할 수 없다면별로 유용하지 않습니다. –
어쩌면 내가 뭔가를 놓치고 있지만 순수한 가상 함수를 "호출"할 수는 없지만 과부하 및 파생 클래스에서 호출 할 수는 있습니다. – vsoftco