1. 동적 바인딩의 효과

- 정적 바인딩보다 느림
- 정적 바인딩보다 메모리도 더 많이 소모함

2. 동적 바인딩 예제

#include
using namespace std;
class point{
public:
int x;
int y;
void show(); // 정의
};

class point2 : public point{
public:
int z;
void show(); // 파생클래스에서 재정의
};

void point::show(){
cout << x << y<< endl;
}

void point2::show(){
cout << z << endl;
}

int main(){
point a; // point의 인스턴스
a.x=10;
a.y=20;
a.show();

point2 b; // point2의 인스턴스
b.z = 30;
b.show();
return 0;
}
// 출력은 a.show()는 1020 b.show()는 30이다.

3. 만약 각자 포인터를 사용한다면?

#include
using namespace std;
class point{
public:
int x;
int y;
void show(); // 정의
};

class point2 : public point{
public:
int z;
void show(); // 파생클래스에서 재정의
};

void point::show(){
cout << x << y<< endl;
}

void point2::show(){
cout << z << endl;
}

int main(){
point *p; // point의 포인터
point a;
p = &a;
p->x=10;
p->y=20;
p->show();
point2 *p2; // point2의 포인터
point2 b;
p2 = &b;
p2->z = 30;
p2->show();
return 0;
}

// 출력은 전과 동일하다.
// 출력은 p->show()는 1020 p2->show()는 30이다.

4. 기반 클래스 포인터로 파생 클래스를 접근한다면?

#include
using namespace std;
class point{
public:
int x;
int y;
void show(); // 정의
};

class point2 : public point{
public:
int x;
int y;
void show(); // 파생클래스에서 재정의
};

void point::show(){
x=10;
y=20;
cout << x << y<< endl;
}

void point2::show(){
x=30;
y=40;
cout << x << y << endl;
}

int main(){
point *p; // point 클래스의 포인터이다.
point a;
p = &a;
p->show();
point2 b; // point 클래스 포인터로 point2 인스턴스를 가리키고 있다?
p= &b;
p->show();
return 0;
}
// 첫번째 show값은 1020이다. 두번째 show값도 1020이다.
// 두번째 show가 3040이 나오려면? virtual을 이용하여 동적 바인딩을 해줘야한다.

5. 동적 바인딩

#include
using namespace std;
class point{
public:
int x;
int y;
virtual void show(); // virtual이 기반 클래스의 멤버함수에 붙었다!
};

class point2 : public point{
public:
int x;
int y;
void show(); // 파생클래스에서 재정의
};

void point::show(){
x=10;
y=20;
cout << x << y<< endl;
}

void point2::show(){
x=30;
y=40;
cout << x << y << endl;
}

int main(){
point *p;
point a;
p = &a;
p->show();
point2 b;
p= &b;
p->show();
return 0;

}

// 달라진건 기반 클래스의 함수에 virtual이 붙었다는 것이다.
// 이때 point 클래스는 point2 클래스를 가리키게 된다.
// 답은 1020 3040이 나오게 된다.
// 개인적으론 애매하다. 재정의 함수가 아니면 필요가 없고 포인터도 파생 클래스용 포인터를 사용하면 필요없다
// 게다가 동적바인딩은 속도도 느리고 메모리도 많이 잡아먹는다.
// 오히려 초보들은 헷갈리기만한다.

'C++' 카테고리의 다른 글

[C++] 디폴트값 의미  (0) 2019.12.06
[C++] 함수 오버로딩  (0) 2019.12.06
[C++] dll 연결 방법  (0) 2019.12.06
[C++] 생성자와 파괴자  (0) 2019.12.05
[C++] public private protected 구분  (0) 2019.12.05
블로그 이미지

ryancha9

https://blog.naver.com/7246lsy

,