씨플플

[C++] 정적바인딩과 동적바인딩

밍디 ٩(ˊ ᗜˋ*)و 2021. 1. 11. 14:09

210111 월요일 강의 정리 - 정적바인딩과 동적바인딩

 

 

정적바인딩


컴파일할 때 어떤 걸 호출할지 미리 결정되는 친구, 프로그램 실행 전에 이미 결정됨

대표적으로 오버로딩이 있음

 

#include <iostream>
using namespace std;

class Parent {
public:
	int num;
};

class Child :public Parent {

};

void add(Parent left, Parent right) {
	cout << "Parent add: " << left.num + right.num << endl;
}

void add(Child left, Child right) {
	cout << "Child add: " << left.num * right.num << endl;
}

int main() {
	Parent p0, p1;
	p0.num = 10; p1.num = 20;
	add(p0, p1); // 30

	Child c0, c1;
	c0.num = 100; c1.num = 200;
	add(c0, c1); // 20000

	Parent& ref0 = c0;
	Parent& ref1 = c1;

	add(ref0, ref1); // ???
}

 

 

 

마지막 세 줄

Parent& ref0 = c0;
Parent& ref1 = c1;

add(ref0, ref1); // ???

ref0이랑 ref1가 실제로 가리키는 친구는 Child 객체이지만 호출한 함수는 파라미터가 Parent 인 void add(Parent, Parent) 함수

 

이렇게 정적바인딩은 객체의 타입(Parent)만 보고 어떤 함수를 호출할 지 결정하기 때문에 실제로 무엇을 가리키는지는 중요하지 않다.

 

그래서 void add(Child, Child) 가 아니라 void add(Parent, Parent) 함수를 호출한 것.

 

 

동적 바인딩


런타임 도중, 실행하면서 결정되는 친구

대표적으로 오버라이딩이 있음

 

#include <iostream>
using namespace std;

class Animal {
public:
	virtual void func() const {
		cout << "운다" << endl;
	}
};
class Dog : public Animal {
public: 
	virtual void func() const override{
		cout << "멍" << endl;
	}
};

class Cat : public Animal {
public:
	virtual void func() const override {
		cout << "냥" << endl;
	}
};

int main() {

	Animal* a0 = new Cat;
	Animal* a1 = new Dog;
	a0->func();
	a1->func();

}

 

 

오버라이딩은 런타임 도중 그니까 실행하는 도중에 객체가 실제 가리키는 친구가 뭔지 매번 확인하고 결정함

단 virtual 선언을 했을 경우에 해당.

virtual 선언안하면 정적바인딩되어서 멍 냥이 아니라 운다가 출력됨 (부모에 의해 오버라이딩한 함수가 가려진다)