원본 : http://www.debuglab.com/knowledge/override.html
1.요약
부모 클래스가 가지고 있는 멤버 함수를 자식 클래스가 재정의하는 과정을 override라고 부릅니다. override를 하게 되는 경우 우리가 잃어버리는 것은 무엇이 있을까요?
2.본문
override를 하는 경우 우리가 잃는 것은 바로 부모 클래스가 가지고 있는 같은 이름의 멤버 함수 입니다.
쉽게 말해서 부모가 Func라는 이름의 overload된 함수를 5개 가지고 있었다고 합시다. 그리고 자식 클래스가 그 중에 하나를 override하게 된다면 우리는 override한 함수만이 아니라 5개의 함수 전부(부모 것만)를 사용할 수 없게 됩니다.
- 예 1 -
다음과 같이 아무일도 하지않는 클래스를 만들어 봅시다.
그런데 여기서 다음과 같이 클래스를 변경해봅시다.
v
아마도 디폴트 생성자가 없다는 에러는 한 번 이상 만나보셨을 겁니다.
- 2001.08.13 Smile Seo -
1.요약
부모 클래스가 가지고 있는 멤버 함수를 자식 클래스가 재정의하는 과정을 override라고 부릅니다. override를 하게 되는 경우 우리가 잃어버리는 것은 무엇이 있을까요?
2.본문
override를 하는 경우 우리가 잃는 것은 바로 부모 클래스가 가지고 있는 같은 이름의 멤버 함수 입니다.
쉽게 말해서 부모가 Func라는 이름의 overload된 함수를 5개 가지고 있었다고 합시다. 그리고 자식 클래스가 그 중에 하나를 override하게 된다면 우리는 override한 함수만이 아니라 5개의 함수 전부(부모 것만)를 사용할 수 없게 됩니다.
- 예 1 -
class A
{
public:
void Func() {}
void Func(int) {}
void Func(int, int) {}
void Func(int, int, int) {}
};
class B : public A
{
public:
void Func(int) {}
};
int main(int argc, char* argv[])
{
B b;
b.Func(); // error
b.Func(1); // ok
b.Func(1, 1); // error
b.Func(1, 1, 1);// error
}
이와 비슷한 개념은 컴파일러가 공짜로 제공해주는 함수에도 똑같이 적용됩니다. 다음과 같이 아무일도 하지않는 클래스를 만들어 봅시다.
class A
{};
그래도 다음과 같은 사용이 가능합니다. A a; A b(a); a = b;그 이유는 컴파일러가 공짜로 A의 디폴트 생성자, 복사 생성자, 대입 연산자를 만들어주기 때문이죠.
그런데 여기서 다음과 같이 클래스를 변경해봅시다.
v
class A
{
A(int) {}
};
이제 우리는 컴파일러가 공짜로 만들어준 디폴트 생성자와 복사 생성자를 사용할 수 없습니다. 우리 나름대로 잘 살아보겠다고 생성자를 하나 만든 것이 이런 대가를 치루게 하는군요. 아마도 디폴트 생성자가 없다는 에러는 한 번 이상 만나보셨을 겁니다.
- 2001.08.13 Smile Seo -
"C++" 카테고리의 다른 글
- auto_ptr (0)2007/03/05
- 템플릿을 이용한 동기화 클래스 만들기 (0)2007/03/05
- Override를 통해 잃어버리는 것들 (0)2007/03/01
- 비교 연산자를 위한 예약어들 (0)2007/03/01
- 할당된 블록의 크기 구하기 (0)2006/12/08
Tags Override

수안이의 컴퓨터 연구실



Leave your greetings.