파생 클래스의 스마트 포인터는 어떻게 기본 클래스로 암시적으로 변환할 수 있습니까?

crdrisko

에서 cppreference ,

T가 일부 base 의 파생 클래스인 경우 암시적으로 B다음 std::unique_ptr<T>으로 변환할 수 있습니다.std::unique_ptr<B>

원시 포인터와 마찬가지로 다형성이 작동하려면 분명히 그래야 합니다. 내 질문은 스마트 포인터가 일반적으로 여기 에서 볼 수 있는 포인터로 변환할 수 없다면 런타임 다형성을 허용하기 위해 스마트 포인터가 사용하는 메커니즘은 무엇입니까? 내 생각은 생성자에서 또는 std::make_unique<>()/ std::make_shared<>()객체의 내부 포인터가 이 변환에 사용 된다는 것입니다 . 그러나 이러한 암시적 변환이 다른 곳에서는 허용되지 않는 경우 스마트 포인터를 구성할 때 get()을 호출하지 않아도 되는 이유는 무엇입니까?

매우 간단한 예로서 다음 테스트를 생각해 냈습니다.

#include <iostream>
#include <memory>

class Base
{
public:
    virtual ~Base() = default;

    virtual void foo() const { std::cout << "Base foo() called." << std::endl; }
};

class Derived : public Base
{
public:
    virtual void foo() const override { std::cout << "Derived foo() called." << std::endl; }
};

void bar(Base* pBase) 
{
    std::cout << "bar() called." << std::endl;
    pBase->foo();
}

int main()
{
    std::unique_ptr<Base> pObject { std::make_unique<Derived>() };      // Implicit conversion here, why no call to get()?

    // bar(pObject);                                                    // Can't be converted, so we have to call get()
    bar(pObject.get());
}
슬라바

내 질문은 스마트 포인터가 일반적으로 여기에서 볼 수 있는 포인터로 변환할 수 없다면 런타임 다형성을 허용하기 위해 스마트 포인터가 사용하는 메커니즘은 무엇입니까?

스마트 포인터는 이러한 변환을 가능하게 하도록 명시적으로 설계되었습니다. std::unique_ptr생성자 문서 에서 볼 수 있듯이 :

template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u ) noexcept; (6)

이 오버로드는 이 목적을 위해 생성됩니다.

이 생성자는 다음이 모두 true인 경우에만 오버로드 해결에 참여합니다.

a) unique_ptr<U, E>::pointer는 암시적 으로 포인터 로 변환 가능 합니다.

b) U는 배열 유형이 아닙니다.

c) Deleter가 참조 유형이고 E가 D와 동일한 유형이거나 Deleter가 참조 유형이 아니고 E가 D로 암시적으로 변환 가능합니다.

강조는 나의 것이다. 따라서 파생 클래스에 대한 포인터는 암시적으로 기본으로 변환할 수 있으므로 이 생성자 오버로드는 이러한 변환을 가능하게 합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

기본 클래스 개체에 대한 파생 클래스 포인터는 파생 클래스의 메서드를 어떻게 호출 할 수 있습니까?

C++: 기본 클래스의 정적 메서드에 나타나는 파생 클래스를 어떻게 앞으로 선언할 수 있습니까?

실제 유형을 몰라도 기본 클래스 포인터를 파생 클래스 포인터로 변환 할 수 있습니까?

파생 클래스 변수를 어떻게 사용할 수 있습니까? 기본 클래스 변수가 자동으로 사용 중입니다.

파생 클래스는 할당에서 기본 클래스로 변환 할 수 없습니다.

기본 클래스에서 파생 클래스로 변수를 어떻게 전달합니까?

다른 클래스 메서드의 '헤더'에있는 클래스 메서드를 기본 변수로 어떻게 참조 할 수 있습니까?

C2440 static_cast는 기본 클래스에서 파생 클래스로 변환 할 수 없습니다.

기본 클래스 생성자로 이동하기 전에 unique_ptr에서 원시 포인터를 어떻게 추출 할 수 있습니까?

파생 클래스는 기본 클래스의 개인 멤버를 다른 기본 클래스의 개인 멤버로 오버로드 할 수 없습니다.

파생 클래스의 템플릿 인수를 CRTP의 기본으로 전달할 수 있습니까?

파생 클래스를 테스트 할 때 기본 메서드를 어떻게 모의 할 수 있습니까?

Num 유형 클래스가있는 인스턴스가 어떻게 암시 적으로 Fractional로 강제 변환 될 수 있습니까?

파생 클래스가 기본 클래스의 개인 메서드를 어떻게 호출 할 수 있습니까?

클래스는 나중에 파생 클래스로 전문화되는 기본 클래스를 멤버로 포함할 수 있습니까?

기본 클래스에서 파생 클래스 함수를 어떻게 친구 할 수 있습니까?

어떻게 기본 클래스 멤버를 파생 클래스 정의에 도입할 수 있지만 오버로드는 하나만 도입할 수 있습니까?

캡처는 어떻게 이것을 기본 클래스에서 람다 함수로 파생 시켰습니까?

shared_ptr은 어떻게 private 기본 클래스로 변환 할 수 있습니까?

React Hooks를 사용하여 생성자가 있는 클래스를 기능적 구성 요소로 어떻게 변환할 수 있습니까?

기본 클래스와 파생 클래스를 모두 포주 할 수있는 암시 적 클래스를 정의하는 방법

액세스 할 수없는 가상 기본 클래스의 생성자를 암시 적으로 호출

이 함수 기반 뷰를 장고의 클래스 기반 뷰로 어떻게 변환 할 수 있습니까?

클래스를 제네릭 기본 클래스로 암시 적으로 변환 할 수없는 이유는 무엇입니까?

파생 클래스 포인터를 기본 클래스로 변환 할 때 기본 클래스가 모호합니다.

파생 클래스에 대한 메모리를 할당하는 기본 클래스의 개체에 대한 포인터 배열의 요소 유형이 무엇인지 어떻게 알 수 있습니까?

부모 클래스의 모든 변수를 초기화 함수가있는 기본 클래스로 어떻게 상속합니까?

파생 클래스 인스턴스에서 부모 클래스 오버로드 함수를 어떻게 호출 할 수 있습니까?

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관