RTTI(Run Time Type Information)
C++์์๋ ๋ฐํ์์ ๊ธฐ์ด ํด๋์ค์ ๊ฐ์ฒด ํฌ์ธํฐ๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋์ง ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ RTTI ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๊ฐ์ฒด ์งํฅ์์ ํด๋์ค ๊ฐ ์์์ ๊ตฌํํ ์ ์๊ณ , ๋คํ์ฑ์ ๊ฐ์ง๊ฒ ๋์ด ๊ธฐ์ด ํด๋์ค๋ ์์ ์ ๋ฉค๋ฒ๋ฅผ ์์ํ ํ์ ํด๋์ค๋ฅผ ์์ ์ ๊ฐ์ฒด ํฌ์ธํฐ๋ก ๊ฐ๋ฆฌํฌ ์ ์๋ค.
Base *pBase = new Derived();
์ปดํ์ผ ๋น์์๋ pBase๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋์ง ์ ์ ์๋ค. ๊ทธ์ ๊ธฐ์ด ํด๋์ค์ ํ์ ํด๋์ค ์ค ์ด๋ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋์ง ์ง์๋ง ํ ์ ์๋ค. ์ด๋ฌํ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ด RTTI์ด๊ณ ํ์ฌ ๊ฐ์ฒด ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด ํ์ ์ ๋ณด๋ฅผ type_info๋ผ๋ ์ด๋ฆ์ผ๋ก vftable์ ์ ์ฅํ๋ค.
1. dynamic_cast()
dynamic_cast๋ ๋ค์ด ์บ์คํ ์์ ์์ฃผ ์ฌ์ฉ๋๋ ํจ์์ด๋ค. ๊ธฐ์ด ํด๋์ค์ ํ์ ํด๋์ค๋ฅผ ์ ์บ์คํ ํด์ ์ ์ธํ๋ค๋ฉด, dynamic_cast๋ก ๋ค์ ์๋ ํํ๋ก ๋์๊ฐ ์ ์๋ค. ๋ง์ฝ ์คํจํ๋ค๋ฉด nullptr๋ฅผ ๋ฆฌํดํ๋ค.
Base *pBase = new Derived();
Derived *pDerived = dynamic_cast<Derived *>(pBase);
์คํจ๋ฅผ ๋ฐฉ์งํ๊ฑฐ๋ ๋ค๋ฅธ ํ์ ํด๋์ค ํ์ ์ผ๋ก ๋ค์ด ์บ์คํ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
if(pDerived = dynamic<Derived*>(pBase)){
pDerived->print();
}
else{
std::cout << "Failed cast to [Derived]" << std::endl;
exit(0);
}
2. typeid ์ฐ์ฐ์, type_info ํด๋์ค
typeid ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฐ์ฒด์ ๋ฐ์ดํฐํ์ด ๋์ผํ์ง๋ฅผ ํ์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ type_info ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ๋ค.
int main(void) {
A* a = new A();
B* b = new B();
A* arr[2];
arr[0] = a;
arr[1] = b;
for (int i = 0; i < 2; ++i)
{
arr[i]->foo();
if (typeid(B) == typeid(*arr[i]))
{
B* bb = (B*)arr[i];
bb->foo();
cout << "ํ์ฌ ํ์
: " << typeid(*arr[i]).name() << endl;
}
}
}
์ฐธ๊ณ
https://velog.io/@cedongne/OOP-C-RTTIRun-Time-Type-Information