객체지향 프로그래밍(C++) - 다중 상속

test·2022년 5월 23일
0

C++.

목록 보기
3/4

기기의 컨버전스와 C++의 다중상속

다중 상속 선언 및 멤버 호출

다중 상속 선언

class MP3 {
public:
 void play();
 void stop();
 };
 
 class MobliePhone {
 public:
 bool sendCall();
 bool receiveCall();
 bool sendSMS();
 bool receiveSMS();
 };
 
 class MusicPhone : public MP3, public MobliePhone {
public:
	void dial(); // 다중 상속 선언.
};

void MusicPhone::dial() { // 다중 상속 활용.
	play();	// mp3 음악을 연주시킴.
    sendial(); // 전화를 건다.
};

int main() { // 다중 상속 활용
	musicPhone hanPhone;
    hanPhone.play();
    hanPhone.sendSMS();
} 

가상 상속

다중 상속으로 인한 기본 클래스 멤버의 중복 상속 해결

가상 상속

파생 클래스의 선언문에서 기본 클래스 앞에 virtual로 선언.

파생 클래스의 객체가 생성될 때 기본 클래스의 멤버는 오직 한번만 생성.

  • 기본 클래스의 멤버가 중복하여 생성되는 것을 방지

가상 함수와 오버라이딩

가상 함수(virtual function)

virtual 키워드로 선언된 멤버 함수

virtual 키워드의 의미

  • 동적 바인딩 지시어
  • 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시

함수 오버라이딩(function overriding)

파생 클래스에서 기본 클


래스의 가상 함수와 동일한 이름의 함수 선언.

  • 기본 클래스의 가상 함수의 존재감 상실시킴.
  • 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩
  • 함수 재정의라고도 부름.
  • 다형성의 한 종류

함수 재정의와 오버라이딩 사례 비교


#include <iostream>
using namespace std;

class Base {
public:
    virtual void f() { cout << "Base::f()called" << endl;}
};

class Derived : public Base {
public:
    virtual void f() {cout << "Derived::f()called" << endl;}
};

int main() {
    Derived d, *pDer;
    pDer = &d;
    pDer->f(); // Derived::f() 호출

     Base * pBase;
     pBase = pDer; // 업캐스팅.
     pBase -> f(); // 동적 바인딩 발생. Derived::f() 실행.
}

동적 바인딩

동적 바인딩

  • 파생 클래스에 대해

  • 기본 클래스에 대한 포인터로 가상 함수를 호출하는 경우

  • 객체 내에 오버라이딩한 파생 클래스의 함수를 찾아 실행

    • 실행 중에 이루어짐
      실행시간 바인딩, 런타임 바인딩, 늦은 바인딩으로 불림

C++ 오버 라이딩의 특징

오버라이딩의 성공 조건

가상 함수 이름, 매개 변수 타입과 개수, 리턴 타입이 모두 일치

class Base {
public:
	virtual void fail();
    virtual void sucess();
    virtual void g(int);
};

class Derived : public Base {
public:
	virtual int fail(); // 오버라이딩 실패. 리턴 타입이 다름
    virtual void sucess(); // 오버라이딩 성공
    virtual void g(int, double); // 오버로딩 사례. 정상 컴파일.
};

class Base {
public:
	virtual void f();
};

class Derived : public Base {
public:
	virtual void f(); // virtal void f()와 동일한 선언.
};
  • 오버라이딩 시 virtual 지시어 생량 가능.
    가상 함수의 virtual 지시어는 상속됨, 파생 클래스에서 virtual 생략 가능

  • 가상 함수의 접근 지정
    private, protected, public 중 자유롭게 지정 가능.

    오버라이딩과 범위 지정 연산자(::)

    범위 지정 연산자(::)

    정적 바인딩 지시

    기본 클래스 :: 가상함수() 형태로 기본 클래스의 가상 함수를 정적바인딩으로 호출.

  • shape::draw();

가상 소멸자

가상 소멸자

  • 소멸자를 virtual 키워드로 선언.

  • 소멸자 호출 시 동적 바인딩 발생.

오버로딩과 함수 재정의, 오버라이딩 비교

가상 함수 오버라이딩

파생 클래스마다 다르게 구현하는 다형성.

void Circle::draw() {cout << "Circle" << endl; }
void Rect::draw() [cout << "Rectangle" << endl; }
void Line::draw() {cout << "Line" << endl; }

파생 클래스에서 가상 함수 draw()의 재정의.

어떤 경우에도 자신이 만든 draw()가 호출됨을 보장 받음.

동적 바인딩에 의해

profile
test

0개의 댓글