본문 바로가기

객체지향

가상함수

반응형



 Q> 이런 결과가 나오는 이유 ?

 

왜냐하면 , aboutMe 함수가 어떤 타입인지는 컴파일 시간에 결정되기 때문이다.

이러한 메커니즘을 정적 바인딩 (static binding)이라고 한다 . 


Q>만일 Student 클래스에서 구현된 aboutMe를 호출하고 싶다면? 

   

=> Person 클래스의 aboutMe 메서드를 virtual로 선언해야한다.




//Virtual 가상함수를 통해 제일 하위 클래스의 aboutMe를 찾아 실행

#include<iostream>

#include<string>

using namespace std;


#define NAME_SIZE 50 //매크로 정의 


class Person {

int id;//모든 멤버는 기본적으로 private

char name[NAME_SIZE];


public:

virtual void aboutMe()  //가상함수를 사용함으로써 

{

cout << "I am a person.";

}

virtual bool addCourse(string s) = 0; //순수 가상 함수 

};


class Student : public Person {

public:

void aboutMe()

{

cout << "I am a Student. ";

}

bool addCourse(string s) {

cout << "Added course "<< s << " to student." << endl;

return true;

}

};

class Teacher : public Student {


public:

void aboutMe()

{

cout << "I am a Teacher. ";

}

bool addCourse(string s) {

cout << "Added course " << s << " to Teacher." << endl;

return true;

}

};

int main()

{

Person *p = new Teacher();

p->aboutMe(); //i am a Teacher 출력 

p->addCourse("History"); //Added course History to Teacher.  출력 

delete p; //할당 받은 메모리를 반환하는 것이 중요 !

return 0;

}

 




이외에도, 부모 클래스에 어떤 메서드를 구현해둘수 없는 경우에도 가상 함수를 사용한다. 


        <예>  

          가령 Student 클래스와 Teacher 클래스를  Person으로 부터 상속 받는다고 해보자.

          이 두 하위 클래스(Student와 Teacher)는 공통으로  addCourse(string S)라는 메서드를 갖고 있어야 할수도 있다. 

          하지만, Person클래스가 addcourse메서드를 직접 호출한다는 것은 말이 되지 않는다.

          왜냐하면 현재 객체가 Student 클래스냐 아니면 Teacher 클래스냐에 따라 addCourse 메서드의 구현자체가 달라지기 때문이다.

          따라서, 이 경우에는 Person 클래스의 addCourse는 순수 가상 함수 ( pure virtual fuction)로 선언하여 그 구현은 하위 클래스에게 맡겨야 한다. 


  


addcourse를 순수 가상 함수로 선언하였으므로 Person클래스는 스스로 객체를 만들어 낼수 없는 추상클래스 (abstract class) 가 된다. 


출처 :코딩 인터뷰 189가지 프로그래밍 문제와 해법 완전 분석 (프로그래밍 인사이트)



반응형

'객체지향' 카테고리의 다른 글

추상화와 인터페이스  (0) 2018.08.23
객체지향 알아 둘 것  (0) 2018.03.27
포인터와 참조  (0) 2018.03.27
가상소멸자  (0) 2018.03.27
클래스와 상속  (0) 2018.03.26