CParent* pParent = &child;
pParent->Output(); // "Child" 출력
CParent*)가 자식 클래스 객체(child)를 가리킴.Output 함수가 가상함수(virtual)로 선언되어 있으면, 자식 클래스의 재정의된 Output이 호출.virtual 키워드로 선언된 함수.class CParent {
public:
virtual void Output() {
cout << "Parent" << endl;
}
};
class CChild : public CParent {
public:
void Output() override {
cout << "Child" << endl;
}
};
int main() {
CParent* pParent = new CChild(); // 부모 포인터로 자식 객체 생성
pParent->Output(); // 자식의 Output 호출 ("Child")
delete pParent;
return 0;
}
출력:
Child
CParent VTable: [ &CParent::Output ]
CChild VTable: [ &CChild::Output ]virtual void FunctionName() = 0;class CParent {
public:
virtual void Output() = 0; // 순수 가상함수
virtual ~CParent() {} // 가상 소멸자
};
class CChild : public CParent {
public:
void Output() override {
cout << "Child" << endl;
}
};
int main() {
CParent* pParent = new CChild();
pParent->Output(); // "Child"
delete pParent;
return 0;
}
출력:
Child
dynamic_cast를 사용하여 안전하게 타입 변환.CParent* pParent = new CChild();
CChild* pChild = dynamic_cast<CChild*>(pParent); // 안전한 다운캐스팅
if (pChild) {
pChild->NewFunc(); // "자식 객체에서만 있는 함수" 출력
}
delete pParent;
출력:
자식 객체에서만 있는 함수
CParent* pParent = &child;
pParent->Output(); // "Child" 출력
Output 호출.((CChild*)pParent)->NewFunc(); // 강제 캐스팅
NewFunc 호출.dynamic_cast 사용 권장.CChild* pChild = dynamic_cast<CChild*>(pParent);
if (pChild) {
pChild->NewFunc(); // 자식 클래스 전용 함수 호출
}
dynamic_cast를 통해 다운캐스팅이 가능한지 확인 후 실행.class CParent {
public:
virtual ~CParent() {
cout << "부모 소멸자" << endl;
}
};
class CChild : public CParent {
public:
~CChild() {
cout << "자식 소멸자" << endl;
}
};
int main() {
CParent* pParent = new CChild();
delete pParent; // 가상 소멸자를 통해 자식 소멸자 → 부모 소멸자 호출
return 0;
}
출력:
자식 소멸자
부모 소멸자
virtual 키워드로 가상함수를 선언하여 정확한 객체의 함수를 호출.dynamic_cast 사용.이 코드는 다형성과 관련된 OOP 개념(가상함수, VTable, 추상화)을 잘 보여주는 예제입니다.