일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BST
- 트리
- 바이낸스
- 템플릿 함수화
- Data Structure
- trading view
- Basic
- Python
- Windows
- template
- 오버로딩
- 연결 리스트
- 후위
- 문자열
- C++
- linked list
- mutable
- 이진 탐색 트리
- 비트코인
- SCM
- 기초
- #선물 #비트코인#알트코인#매매#코인#마진
- Tree
- 전위
- 자료구조
- 알고리즘
- 숫자
- 선물
- array
- 순회
Archives
- Today
- Total
Project Hub
10. 업 캐스팅 & 다운 캐스팅 본문
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
반응형
'C++ > c++ basic' 카테고리의 다른 글
12. 입출력 (istream, ostream) (0) | 2022.12.21 |
---|---|
11. virtual 함수와 다형성 (0) | 2022.12.21 |
9. 전위/후위 증감 연산자 오버로딩 & 첨자 연산자 오버로딩 (0) | 2022.12.21 |
8. 입출력 연산자 오버로딩 (1) | 2022.12.21 |
7. 이항 연산자 오버로딩 (2) | 2022.12.21 |
Comments