두 용어는 비슷하게 생겨서 꽤나 헷갈린다.
사전적 의미를 알아보면..
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함수가 무시된 것이다.