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();
}
래스의 가상 함수와 동일한 이름의 함수 선언.
#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() 실행.
}
파생 클래스에 대해
기본 클래스에 대한 포인터로 가상 함수를 호출하는 경우
객체 내에 오버라이딩한 파생 클래스의 함수를 찾아 실행
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; }
동적 바인딩에 의해