(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();
}
------------->데이터 유실은 발생하지 않지만 함수오버라이딩은 발생하지 않는다.
하지만 가상함수를 통해 가능하다.
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();
}
------------->데이터 유실은 발생하지 않지만 함수오버라이딩은 발생하지 않는다.
하지만 가상함수를 통해 가능하다.
댓글
댓글 쓰기