-
[C++] Dynamin Binding <Virtual Function, Virtual Destructor>공부/C++ 2020. 11. 6. 19:48
상속개념을 도입하면서 유용하게 사용할 수 있는 동적바인딩!!
우선 Binding(바인딩)이란?
프로그램 구성 요소의 성격을 결정해주는 것
예를 들면 변수의 데이터 타입을 결정하는 것이 있어요.
그렇다면 동적 바인딩이란??
Dynamic! 즉 실행시간에 구성요소의 성격이 결정되는 것
C++ 에서 Dynamic Binding을 사용하려면???
1. virtual
부모 클래스의 멤버함수에 가상함수를 생성해요
2. variable type, value type
부모클래스 포인터 또는 레퍼런스 타입을 변수 타입으로! child클래스의 객체를 값으로!
예시 코드를 보면서 이해해봐요😎
class Person { public: virtual void talk() {cout << "안녕하세요. 사람입니다. 개굴" << endl;} }; class Student : pubic Person { public: void talk() {cout << "안녕. 학생이야." << endl;} }; class Gagul : pubic Person public: void talk() {cout << "개굴개구르르개골" << endl;} }; class OtherPerson : pubic Person { }; void main() { Person *aPerson[4]; aPerson[0] = new Person(); aPerson[1] = new Student(); aPerson[2] = new Gagul(); aPerson[3] = new OtherPerson(); for(int i = 0; i < 4; i++) aPerson[i]->talk(); return 0; }
출력
with virtual without virtual 안녕하세요. 사람입니다. 개굴
안녕. 학생이야.
개굴개구르르개골
안녕하세요. 사람입니다. 개굴안녕하세요. 사람입니다. 개굴
안녕하세요. 사람입니다. 개굴
안녕하세요. 사람입니다. 개굴
안녕하세요. 사람입니다. 개굴가상함수를 정의했다면 소멸자도 가상함수로!!!!😉
Person *student = new Student; student->talk(); delete student();
위의 delete에서 student는 Person의 포인터이므로 Person의 소멸자를 호출해요.
하지만!! 실제로는 Student클래스의 객체이므로 Student의 소멸자를 호줄해야해요.
그렇기 때문에 소멸자도 가상함수로 선언합니다!
class Person { public: Person() {cout << "Constructor: Person" << endl;} virtual ~Person() {cout << "Destructor: Person" << endl;} }; class Student : pubic Person { public: Student() {cout << "Constructor: Student" << endl;} ~Student() {cout << "Destructor: Student" << endl;} }; void main() { Person *gagul = new Student(); delete gagul; }
'공부 > C++' 카테고리의 다른 글
[객체지향프로그래밍] 응집도(Cohesion)와 결합도(Coupling) (0) 2020.11.03 cin, scanf 속도비교 (0) 2020.08.11 Pair (0) 2020.07.26 std::string (0) 2020.07.26 namespace (2) 2020.07.26