> 백엔드 개발 > C++ > 파생 클래스의 포인터 간 포인터를 기본 클래스의 포인터 간 포인터로 암시적으로 변환할 수 없는 이유는 무엇입니까?

파생 클래스의 포인터 간 포인터를 기본 클래스의 포인터 간 포인터로 암시적으로 변환할 수 없는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-29 10:49:02
원래의
897명이 탐색했습니다.

Why Can't You Implicitly Convert a Pointer-to-Pointer of a Derived Class to a Pointer-to-Pointer of a Base Class?

파생 클래스와 기본 클래스 간 포인터-포인터의 암시적 변환

파생 클래스와 기본 클래스 간의 포인터-포인터 변환을 처리하는 경우 클래스에서 일반적으로 발생하는 오류는 파생 클래스(Child)의 포인터 간 포인터를 기본 클래스(Base)의 포인터 간 포인터로 암시적으로 변환할 수 없다는 것입니다. 이러한 변환은 예상치 못한 잠재적으로 위험한 상황으로 이어질 수 있기 때문입니다.

제공된 예제 프로그램을 고려하십시오.

<code class="cpp">class Base { };

class Child : public Base { };

int main()
{   
    Child *c = new Child();
    Base *b = c;

    Child **cc = &amp;c;
    Base **bb = cc; // error: invalid conversion from ‘Child**’ to ‘Base**’
}</code>
로그인 후 복사

컴파일러가 cc(Child) 할당을 방지하기 때문에 오류가 발생합니다. )을 bb(베이스)로 변환합니다. 이 금지의 근본적인 이유는 bb가 가리키는 개체의 잠재적인 불일치를 방지하기 위한 것입니다. 이러한 변환이 허용되면 bb가 Child에서 파생되지 않은 Base 인스턴스를 가리키는 시나리오가 발생할 수 있습니다.

이 문제를 해결하려면 다음 두 가지 접근 방식이 있습니다.

  1. 명시적 캐스팅 사용: C 스타일 캐스팅 또는 reinterpret_cast를 활용하여 수동으로 변환을 수행합니다. 그러나 이 접근 방식은 유형 안전성을 상실합니다.
  2. 클래스 정의 수정: 가상 포인터 또는 다중 상속을 도입하여 파생 클래스와 기본 클래스 간의 유효한 관계를 설정하도록 클래스 정의를 수정하여 안전을 허용합니다. 암시적 변환.

위 내용은 파생 클래스의 포인터 간 포인터를 기본 클래스의 포인터 간 포인터로 암시적으로 변환할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿