A * pA = new B 과 B * pB = new B의 차이점.
오늘 갑자스럽게 아는 동생이 물어본것이 있었다..
상속 관계에서 클래스 객체 선언방식의 차이점이 었다.
즉,
A * pA = new B;
B * pB = new B;
이 두개의 차이점
쉽게 이야기해서 접근시작점의 차이인데.. 초반에 버벅거리다니...
아직 내공 부족인가 보다.
아무튼 기억을 더듬어서 대답해주고 확인겸 프로그래밍해보고
다시 잊어버리지 말라구 기록에 남긴다.
위의 차이점은 간단히 말해
A * pA = new B;
부모 클래스의 virtual 함수에 의한 오버라이딩을 위해 쓴다고 말하면 될것 같다.
예를 들어 A클래스에 virtual void A1()이라는 함수가 있고 B클래스에 void A1()이라는 함수가 있다면
pA->A1()는 당연히 B 클래스의 A1()이 호출된다.
만약 B 클래스의 A1()이 없다면 A 클래스의 A1() 호출된다.
그런데 B클래스에 A1()있고 A 클래스에도 A1()있는데 A클래스의 virtual 키워드가 붙지 않았다면
A클래스의 A1()이 B 클래스를 무시하고 실행되어 버린다. 왜? A부모우선이니.
그런데 B * pB = new B; 에서는 B클래스의 A1()이 실행된다.
말그대로 B 클래스 우선이 된다.
아래는 대략적인 예제 남긴다.
내공를 쌓도록 공부하면 잊지 말도록 하자 정말로....
#include <iostream>
#include <stdio.h>
using namespace std;
class A
{
public:
virtual void A1(){cout<<"A::A1"<<endl;}
void A2(){cout<<"A::A2"<<endl;}
};
class B:public A
{
public:
virtual void A1(){cout<<"B::A1"<<endl;}
void A2(){cout<<"B::A2"<<endl;}
void A3(){cout<<"B::A3"<<endl;}
};
void main()
{
A * pA = new B;
B * pB = new B;
pA->A1(); //B::A1()
pB->A1(); //B::A1();
pA->A2(); //A::A2();
pB->A2(); //B::A2();
//다운 캐스팅;
//pA->A3(); //에러
pB->A3(); ////B::A3(); 에러아님 자식인 B클래스부터 접근하기 때문에
//업캐스팅
cout<<"업캐스팅"<<endl;
( (A*)pB)->A2(); //A::A2();
//다운캐스팅
//pA->A3(); //에러었지만
((B*)pA)->A3(); ///B::A3();
delete pA;
delete pB;
}
[출처] A * pA = new B 과 B * pB = new B의 차이점.|작성자 찐남자
'Programming > C/C++' 카테고리의 다른 글
TCHAR을쓰면 바뀌는 함수들 (0) | 2010.07.27 |
---|---|
TCHAR printf (0) | 2010.07.12 |
__super C++ 키워드 (0) | 2010.06.03 |
[펌] assert 문 사용하기 (0) | 2010.05.13 |
[펌] try-catch 예외처리 비용? (0) | 2010.05.13 |