c++ 다형성

Hyunwoo Lee
3 min readFeb 28, 2024

--

  • Overloading : 매소드의 이름이 같은데 반환형, 매개변수, 구현부를 다르게 정의.
  • Overriding : 메소드의 시그니쳐는 같은데 구현부를 재정의.
  • Virtual function : 아래 코드에서 virtual이 없기 때문에, base를 상속받은 뒤에 함수를 오버라이딩한 포인터를 이용함 불구하고 base 클래스의 기존 함수가 호출됨(정적 바인딩). virtual function을 이용하면 동적바인딩으로 바뀌어서 어떤 포인터가 할당되냐에 따라서 다른 함수가 호출될 수 있다.
#include <iostream>
using namespace std;

class Base {
public:
void show() { // virtual 키워드 없음
cout << "Base class show function called" << endl;
}
};

class Derived : public Base {
public:
void show() { // Base 클래스의 show() 함수를 오버라이딩
cout << "Derived class show function called" << endl;
}
};

int main() {
Base* basePtr;
Derived derivedObj;
basePtr = &derivedObj;

// 정적 바인딩: Base 클래스의 show() 함수 호출
basePtr->show(); // "Base class show function called" 출력

return 0;
}

<output>
Base class show function called
  • 추가적인 케이스 : 여기서 사실 draw() 함수는 오버라이딩된 함수를 제대로 호출하지만, center()함수의 경우 Figure에 선언되어있는 center()함수가 호출되고 이때, draw가 virtual 선언 여부에 따라서 동작바인딩, 정적바인딩이 달라짐. 아래 상태에서는 정적바인딩으로 Figure의 draw()가 호출.
  • 바꾸려면 Figure의 void draw()를 virtual void draw()로 수정.
class Figure{
public :
void draw(){
cout<<"Figure::draw()\n";
}
void center(){
cout <<"Erase\n";
cout <<"Move to center\n"; draw();
}
};
class Circle: public Figure{
public :
void draw(){
cout<<"Circle::draw()\n";
}
};

int main(void){
Figure f;
Circle c;
f.draw();
c.draw();
f.center();
c.center();
}

<output>
Figure::draw()
Circle::draw()
Erase
Move to center
Figure::draw()
Erase
Move to center
Figure::draw()

--

--