블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

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

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

즉,

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

반응형

'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
Posted by blueasa
, |