Project Hub

10. 업 캐스팅 & 다운 캐스팅 본문

C++/c++ basic

10. 업 캐스팅 & 다운 캐스팅

safy 2022. 12. 21. 13:53
728x90
반응형

이전 글

2022.12.21 - [C++/c++ basic] - 9. 전위/후위 증감 연산자 오버로딩 & 첨자 연산자 오버로딩

 

9. 전위/후위 증감 연산자 오버로딩 & 첨자 연산자 오버로딩

이전 글 2022.12.21 - [C++/c++ basic] - 8. 입출력 연산자 오버로딩 8. 입출력 연산자 오버로딩 이전 글 2022.12.21 - [C++/c++ basic] - 7. 이항 연산자 오버로딩 7. 이항 연산자 오버로딩 이전 글 2022.12.21 - [C++/c++ b

projecthub.tistory.com


업 캐스팅

파생 클래스에서 기반 클래스로 캐스팅 하는 것

다운 캐스팅

기반 클래스에서 파생 클래스로 캐스팅 하는 것

 

결론적으로 컴파일러는 함부로 다운 캐스팅 하는 것을 금지하고 있다.

아래는 업 캐스팅의 예시다.

#include <iostream>
#include <string>
 
class CBase
{
public:
    CBase() : strBase("기반") { std::cout << "기반 클래스" << std::endl; }
 
    void what() { std::cout << strBase << std::endl; }
 
public:
    std::string strBase;
};
 
class CDerived : public CBase
{
public:
    CDerived() : strDerived("파생") { std::cout << "파생 클래스" << std::endl; }
 
    void what() { std::cout << strDerived << std::endl; }
 
public:
    std::string strDerived;
};
 
int main()
{
    CBase b;
    CDerived d;
 
    std::cout << "=== 포인터 버전 ===" << std::endl;
 
    CBase* pb = &d; // 업케스팅
    pb->what();
 
    return 0;
}
 
// 출력은
  
기반 클래스
기반 클래스
파생 클래스
=== 포인터 버전 ===
기반

 

 

다음은, 다운 캐스팅의 예시다.


1. static_cast 를 이용해 강제로 타입을 변환하는 경우
2. 업 캐스팅 후, 해당 객체를 다운 캐스팅하는 경우
3. 바로 다운 캐스팅 하는 경우

 

위 세 가지 다운 캐스팅은 컴파일러가 오류를 반환하거나 런타임에 오류가 발생할 수 있는 케이스다.

#include <iostream>
#include <string>
 
class CBase
{
public:
    CBase() : strBase("기반") { std::cout << "기반 클래스" << std::endl; }
 
    void what() { std::cout << strBase << std::endl; }
 
public:
    std::string strBase;
};
 
class CDerived : public CBase
{
public:
    CDerived() : strDerived("파생") { std::cout << "파생 클래스" << std::endl; }
 
    void what() { std::cout << strDerived << std::endl; }
 
public:
    std::string strDerived;
};
 
int main()
{
    CBase b;
    CDerived d;
 
    std::cout << "=== 포인터 버전 ===" << std::endl;
 
//1.
    CBase* pb = &b;
    CDerived* pd = static_cast<CDerived*>(pb);
//2.
    CBase* pb = &d;
    CDerived* pd = pb;
     
//3.
    CDerived* pd = &b;
 
    pd->what();
    return 0;
}



728x90
반응형
Comments