(C++)11장-2. 함수 오버라이딩, 업 캐스팅과 다운 캐스팅의 이해

#define NAME_LEN 20

class Person
{
 protected:
  char name[NAME_LEN];
  int age;
public:
 Person(char* name,int age)
{
 strcpy_s(this->name,name);
 this->age=age;
 cout<<"Person::Person(name,age) 생성자 완료"<<endl;
}
~Person()
{
 cout<<"Person::~Person() 소멸자 완료"<<endl;
}
void introduce()
{
 cout<<"Person의 이름"<<endl;
 cout<<"Person의 나이"<<endl;
}

};

class Chulsoo:public Person
{
 private:
  int numOfBooks;
 public:
 Chulsoo(char* name,int age,int numOfBooks):Person(name,age)
{
 this->numOfBooks=numOfBooks;
 cout<<"생성자 완료"<<endl;
}
~Chulsoo(){}

/*void introduce()
{
 cout<<"철수의 이름"<<name<<endl;
 cout<<"철수의 나이:"<<age<<endl;
}
};

int main(void)
{
 Person person("사람",100);
 person.introduce();

 Chulsoo chulsoo("철수",32,3);
 chulsoo.introduce();
}
---------->>>>chulsoo.introduce는 주석처리 되어 상위클래스인 Person클래스의 introduce메소드를 호출 하게 된다(상속받았으므로) 만약 주석을 제거하고 introduce메소드를 호출하면 Chulsoo클래스에서 재정의한 introduce메소드를 호출 한다.
이를, 함수오버라이딩이라 한다.


<<<업 캐스팅과 다운캐스팅>>>

하위 클래스의 객체를 상위 클래스의 객체 대입할 때 발생하는 형변환을 업캐스팅이라고 한다. 상위클래스의 객체를 하위 클래스의 객체에 대입 할 떄 발생하는 형 변환을 다운 캐스팅이라 한다.

예제)

int main(void)
{
 cout<<"=======(Chulsoo->Person)업 캐스팅======="<<endl;
 Chulsoo chulsooUp=Chulsoo("철수",32,3);
 Person personUp=chulsooUp;  //업 캐스팅
 personUp.introduce();

 //Person personDown=Person("사람",100);
  // Chulsoo chulsooDown=personDown; 다운캐스팅 에러발생
}

------>하위클래스의 객체를 상위클래스의 객체로 대입할 때 발생하는 형 변환인 업 캐스팅은 잘 실행되지만, 상위클래스의 객체를 하위클래스의 객체로 대입할떄 발생하는 형변환인 다운캐스팅은 오류가난다.
하지만, 상위클래스의 introduce메소드를 하위클래스인 Chulsoo클래스에서 오버라이딩 하였지만 오버라이딩이 되지 않았다. 또한 데이터도 유실된다.
데이터 유실을 방지하기 위해서는 다음과 같다.

int main(void)
{
 cout<<"============(Chulsoo->Person)업 캐스팅(참조)========="<<endl;
Chulsoo chulsooRef=Chulsoo("철수",32,3);
Person& personUpRef=chulsooRef;
persoUpRef.introduce();

cout<<"=======(Chulsoo->Person)업 캐스팅(포인터)========"<<endl;
Person* personUpRef=new Chulsoo("철수",32,3);
personUpptr->introduce();
}

------------->데이터 유실은 발생하지 않지만 함수오버라이딩은 발생하지 않는다.
하지만 가상함수를 통해 가능하다.

댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기