상속을 통해 두 개의 간단한 클래스를 만들고 하위 클래스에 가상 함수와 재정의를 추가합니다.C++ : 포인터가없는 공변 반환 형식
이 경우class Parent
{
public:
virtual Parent foo();
};
class Child : public Parent
{
public:
Child foo() override;
};
, 내 오버라이드 (override) 함수는 오류가 발생합니다 : error C2555: 'Child::foo': overriding virtual function return type differs and is not covariant from 'Parent::foo'
내가 포인터를 반환 형식을 변경하는 경우 :
class Parent
{
public:
virtual Parent* foo();
};
class Child : public Parent
{
public:
Child* foo() override;
};
오류가 사라! 반환 형식의 공분산을 포인터로 수행해야하는 이유와 값 형식이나 참조를 사용할 수없는 이유를 모르겠습니다. 일부 웹 사이트 또는 포럼에서는 반환 값이 함수에 사용 된 값의 복사본이기 때문에 컴파일러에서 포인터의 일정한 크기를 알고 있지만 재정의 된 함수와 부모 함수에 대해 다른 크기를 나타내야한다는 것을 설명합니다. 이는 분명히 불가능합니다 .
그래서이 경우 포인터 이외의 다른 것을 사용할 수없는 이유는 무엇입니까? 포인터를 사용하지 않고 재정의 된 함수에서 자식 형식을 사용하려면 각 함수의 기본 클래스를 반환하고 반환 된 형식을 자식 형식으로 캐스팅해야합니까?
보조 이외 : 포인터를 사용할 필요가 없습니다. 참조도 사용할 수 있습니다. –
"함수는 포인터를 사용하지 않고 각 함수의 기본 클래스를 반환하고 반환 된 형식을 자식 형식으로 캐스팅해야합니다."아니요. 부모 개체를 자식으로 캐스팅 할 수 없습니다. 반환 된 객체는 전체 객체입니다. 자식은 없습니다. 'return child;라고하면'Child' 객체는 * sliced *를 얻고'Parent' 부분 만 복사합니다. –