from: http://blog.naver.com/cosmical?Redirect=Log&logNo=60060170999


두 용어는 비슷하게 생겨서 꽤나 헷갈린다.

사전적 의미를 알아보면..

 

Override: ~보다 우위에 서다. ~을 넘어서까지 퍼지다. ~을 무효로 하다.

Overload: ~에 짐을 너무 많이 싣다. 부담을 너무 많이 지우다.

 

사전의 의미만 봐도 대충 감이 온다. override를 하면 이전에 정의한 함수를 무효로 하고 새로 정의한 내용으로 쓰겠다는 의미일거고, overload는 중복해서 정의해서 사용을 하겠다는 의미가 될 것이다.

 

이제 저 두 용어가 C++에서는 어떤 개념으로 사용되는지 알아보자. (참조: Teach Your Self C++ in 21Days)

 

Override와 Overload는 [chapter 12. 상속]에 나온다.

아래의 12.4의 예제코드를 보면.. 파랑색으로 되어 있는 부분이 있다.

Dog이라는 클래스는 Mammal이라는 클래스를 상속했다.

그러면서 Dog클래스의 생성자를 overload해서 여러 개 선언을 했다. 별도로 설명은 하지 않겠다.

 

1:     //Listing 12.4 Overloading constructors in derived classes
2:
3:     #include <iostream.h>
4:     enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };
5:
6:     class Mammal
7:     {
8:     public:
9:        // constructors
10:       Mammal();
11:       Mammal(int age);
12:       ~Mammal();
13:
14:       //accessors
15:       int GetAge() const { return itsAge; }
16:       void SetAge(int age) { itsAge = age; }
17:       int GetWeight() const { return itsWeight; }
18:       void SetWeight(int weight) { itsWeight = weight; }
19:
20:       //Other methods
21:       void Speak() const { cout << "Mammal sound!\n"; }
22:       void Sleep() const { cout << "shhh. I'm sleeping.\n"; }
23:
24:
25:    protected:
26:       int itsAge;
27:       int itsWeight;
28:    };
29:
30:    class Dog : public Mammal
31:    {
32:    public:
33:
34:       // Constructors
35:       Dog();
36:       Dog(int age);
37:       Dog(int age, int weight);
38:       Dog(int age, BREED breed);
39:       Dog(int age, int weight, BREED breed);

40:       ~Dog();
41:
42:       // Accessors
43:       BREED GetBreed() const { return itsBreed; }
44:       void SetBreed(BREED breed) { itsBreed = breed; }
45:
46:       // Other methods
47:       void WagTail() { cout << "Tail wagging...\n"; }
48:       void BegForFood() { cout << "Begging for food...\n"; }
49:
50:    private:
51:       BREED itsBreed;
52:    };

아래의 12.5의 예제 코드는 override를 보여준다.

Dog클래스는 Mammal이라는 클래스를 상속받았다. 그러면서 Mammal의 Speak라는 함수를 override해서 사용하는 것이다.  (예제코드는 컴파일이 되도록 수정을 했다. VS 2005기준)

 

#include <iostream>

enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
 // constructors
 Mammal() { std::cout << "Mammal constructor...\n"; }
 ~Mammal() { std::cout << "Mammal destructor...\n"; }

 //Other methods
 void Speak()const { std::cout << "Mammal sound!\n"; }
 void Sleep()const { std::cout << "shhh. I'm sleeping.\n"; }

protected:
 int itsAge;
 int itsWeight;
};

class Dog : public Mammal
{
public:

 // Constructors
 Dog(){ std::cout << "Dog constructor...\n"; }
 ~Dog(){ std::cout << "Dog destructor...\n"; }

 // Other methods
 void WagTail() { std::cout << "Tail wagging...\n"; }
 void BegForFood() { std::cout << "Begging for food...\n"; }
 void Speak()const { std::cout << "Woof!\n"; }

private:
 BREED itsBreed;
};

// 코드 옆에 주석 부분이 그 줄을 실행했을 때 나온 결과이다.

int _tmain(int argc, _TCHAR* argv[])
{
 Mammal bigAnimal;  //Mammal constructor...
 Dog fido;             //Mammal constructor...
                         //Dog constructor...
 bigAnimal.Speak();  //Mammal sound!
 fido.Speak();         //Woof!
 return 0;             //Dog destructor...
                         //Mammal destructor...
                         //Mammal destructor...

}

결과를 보면..bigAnimal은 Mammal클래스이므로 Speak를 호출했을 때 "Mammal sound!"를 출력한다. 그러나 fido는 Dog클래스이고, Dog클래스는 Speak함수를 override하였으므로 "Mammal sound!"대신에 "Wood!"를 출력한다. 즉, Mammal의 Speak함수가 무시된 것이다.



 



Posted by 세모아
,