C++에서 동적 주물 사용

Jinku Hu 2023년10월12일
C++에서 동적 주물 사용

이 기사에서는 C++에서 동적 캐스트를 사용하는 방법에 대한 여러 방법을 보여줍니다.

dynamic_cast를 사용하여 기본 클래스 포인터에서 파생 된 포인터로 변환

dynamic_cast를 사용하면 프로그래머가 상속 계층 구조에서 클래스에 대한 포인터와 참조를 변환 할 수 있습니다. 예를 들어, 기본 클래스 포인터를 파생 클래스 포인터로 캐스팅하고 프로그래머가 파생 클래스 멤버 함수를 호출 할 수 있습니다.

dynamic_cast는 컴파일 타임이 아닌 런타임에 객체 유형에 액세스하는 방법을 제공하는 RTTI (Run-Time Type Information) 기능의 일부입니다.

dynamic_castint 또는float와 같은 기본 유형간에 변환하는 데 사용할 수 없습니다. 또한 기본 클래스에 가상 멤버 함수가 하나 이상 포함되어있는 경우에만 dynamic_cast를 사용해야합니다. 다음 예제에서는 새로운Base 클래스 포인터를 선언하고Derived 클래스에 대한 새 포인터로 캐스팅합니다. dynamic_castnull 포인터를 반환하므로 캐스트가 실패하면 표현식을if 문에 조건으로 넣을 수 있습니다.

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct Base {
  virtual ~Base() = default;
};

struct Derived : public Base {};

int main() {
  Base *bp = new Derived;
  if (Derived *dp = dynamic_cast<Derived *>(bp)) {
    cout << "Successful cast - can use the pointer to 'Derived' object dp"
         << endl;
  }

  delete bp;
  return EXIT_SUCCESS;
}

출력:

Successful cast - can use the pointer to 'Derived' object dp

프로그래머는if 섹션 범위의 객체에 안전하게 액세스하고 필요에 따라Derived 클래스 멤버 메서드를 호출 할 수 있습니다. 단, 우리는Derived 클래스 유형을Base로 캐스팅하고 있기 때문에 13 번째 줄에서new 연산자 뒤에Derived를 지정합니다. 다음 코드는 실패한 캐스팅을 생성합니다.

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct Base {
  virtual ~Base() = default;
};

struct Derived : public Base {};

int main() {
  Base *bp = new Base;
  if (Derived *dp = dynamic_cast<Derived *>(bp)) {
    cout << "Successful cast - can use the pointer to 'Derived' object dp"
         << endl;
  }

  delete bp;
  return EXIT_SUCCESS;
}

RTTI 기능의 다른 부분은 주어진 표현식의 유형을 반환하는typeid 연산자입니다. 다음 코드 샘플에서 설명하는 것처럼 여러 표현식의 유형을 비교하는 데 사용할 수 있습니다. typeid 연산자를 사용할 때는<typeinfo>헤더를 포함해야합니다.

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct Base {
  virtual ~Base() = default;
};

struct Derived : public Base {};

int main() {
  Base *bp = new Derived;
  if (Derived *dp = dynamic_cast<Derived *>(bp)) {
    cout << "Successful cast - can use the pointer to 'Derived' object dp"
         << endl;
    if (typeid(*bp) == typeid(*dp)) {
      cout << "bp and dp are of same type" << endl;
    }
  }

  delete bp;
  return EXIT_SUCCESS;
}

출력:

Successful cast - can use the pointer to 'Derived' object dp
bp and dp are of same type
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Cast