Programming/C/C++

A * pA = new B 과 B * pB = new B의 차이점.

blueasa 2010. 6. 21. 17:11

오늘 갑자스럽게  아는 동생이 물어본것이 있었다..

상속 관계에서 클래스 객체 선언방식의 차이점이 었다.

즉,

  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;
}

반응형