C , C++, C#

C++ 함수 오버라이딩 간단정리

vhxpffltm 2019. 3. 6. 21:50

참고 : https://koocci.github.io/


다형성과 상속은 아주 중요한 개념이다. 항상 머리속으로 생각하고 있어야 한다.


이와 함께 C++ 함수 오버라이딩에 관해 알아보자.


알아보기전에, 보통 C++프로그래머라면 기술시험 및 면접에서 오버로딩(Overloading)과 오버라이딩(Overriding)에 대해 자주 묻는다.


오버로딩(Overloading) : 같은 이름의 함수에 매개변수를 다르게 사용하여 매개변수에 따라 다른 함수가 실행

                        

                              특징)   메소드 이름이 같다.

                                        리턴형이 같아도 되고 달라도 된다.

                                        파라미터 갯수가 달라야함

                                        파라미터 갯수가 같으면, 자료형이 달라야함    


오버라이딩(Overriding) ; 상속받았을때, 부모클래스의 함수를 사용하지 않고 다른 기능을 실행할때, 함수를 자식클래스에 같은 이름, 매개변수로 재정의 

         

                              특징) 메소드가 상위 클래스에 있어야함

                                      메소드 이름이 같다

                                      메소드 파라미터 갯수, 자료형 같다.

                                      메소드 리턴형이 같다.

                                      상위 메소드와 동일하거나 내용이 추가되어야 한다.



위 특징과 개념정리는 매우 중요하고 자주 나오는 내용이기 떄문에 알아두자.


함수 오버라이딩 - 확장성

부모클래스 함수는 오버라이딩을 한 유도클래스의 함수에 가려짐(은닉) -> 함수호출시 자식 클래스의 함수가 호출된다.

다형성에서 공부한 포인터로 해당 객체를 가리키면 해당 클래스의 함수에 접근가능


기본 클래스에 선언된 맴버와 같은 형태의 맴버를 파생클래스에서 선언하는것


다음의 간단한 코드를 통해 이해할 수 있을 것이다. 프로그램을 돌려보고 실행결과를 확인하고 클래스를 더 추가하여 활용해도 좋을 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<stdio.h>
#include<iostream>
 
using namespace std;
 
class Base
{
public:
    void f() {
        cout << "Base클래스" << endl;
    }
};
 
class Derived : public Base {
public:
    void f() {// Base 클래스의 f함수 오버라이딩 
        cout << "Derived클래스" << endl;
    }
};
 
class Derived2 : public Derived {
public:
    void f() { // Derived 클래스의 f()함수 오버라이딩
        cout << "Derived2클래스" << endl;
    }
};
 
int main()
{
    Derived D;
    Derived* s = new Derived2;
    Base* B = new Derived;  
    Base* B2 = new Derived2;
    //자식을 부모에 대입, 상속받았으니 가능  자식객체를 부모객체로 간주
    D.f(); // Base클래스의 함수를 호출, AAA클래스의 함수를 가림(은닉)
    B->f(); // Base클래스의 함수를 호출
    s->f(); // Derived클래스의 함수를 호출
    B2->f(); // Base클래스 함수호출
    delete B;
    delete s;
    delete B2;
    return 0;
}
cs