42Seoul/CPP Module 06

ex02

재윤 2024. 1. 26. 17:18
반응형

들어가기 전 dynamic_cast를 공부하고 가자

https://wo-dbs.tistory.com/168

 

dynamic_cast

dynamic_cast는 주로 다형성(polymorphism)과 관련이 있다. 이 연산자는 런타임에 안전한 형변환을 수행한다. 즉, 동적으로 객체의 타입을 확인하고, 그 결과에 따라 적절한 형변환을 수행한다. 주로 상

wo-dbs.tistory.com

 

 

  • ex02에서는 업캐스팅을 하는 문제이다.
  • Base 클래스 A, B, C가 상속을 받으며 업캐스팅을 한다.
#include "Base.hpp"
#include "A.hpp"
#include "B.hpp"
#include "C.hpp"
#include <ctime>
#include <cstdlib>
#include <iostream>

static Base* generate()
{
	srand(time(NULL));
	int num = rand() % 3;
	switch (num)
	{
		case 0:
			return new A();
			break;
		case 1:
			return new B();
			break;
		case 2:
			return new C();
			break;
		default:
			return NULL;
	}
}

void identify(Base *p)
{
	if (dynamic_cast<A*>(p))
		std::cout << "A\\n";
	else if (dynamic_cast<B*>(p))
		std::cout << "B\\n";
	else if (dynamic_cast<C*>(p))
		std::cout << "C\\n";
}

void identify(Base &p)
{
	try
	{
		A &a = dynamic_cast<A&>(p);
		std::cout << "A\\n";
		(void)a;
	}
	catch(const std::exception& e){ }
	try
	{
		B &b = dynamic_cast<B&>(p);
		std::cout << "B\\n";
		(void)b;
	}
	catch(const std::exception& e){}
	try
	{
		C &c = dynamic_cast<C&>(p);
		std::cout << "C\\n";
		(void)c;
	}
	catch(const std::exception& e){}
	
}

int main()
{
	Base *base = generate();
	std::cout << "identify(Base *p) : ";
	identify(base);
	std::cout << "identify(Base &p) : ";
	identify(*base);

	if (base)
		delete base;
}
반응형

'42Seoul > CPP Module 06' 카테고리의 다른 글

ex01  (1) 2024.01.26
ex00  (1) 2024.01.26