본문 바로가기

C++

가상 함수

반응형

가상함수의 경우 동적바인딩(바인딩 : 함수호출코드에서 어느위치에 함수를 실행하라는것, 일반함수의 경우 컴파일에서 결정해주는 정적바인딩을 사용하나 가상함수는 프로그램이 실행될때 객체를 결정하므로 런타임시 결정되는 동적바인딩, 동적바인딩은 시스템 자원의 소모가 있어 C++은 정적바인딩을 기본으로 사용한다)

virtual void Sum() =0;

순수 가상 함수 : 필수로 자식클래스가 구현하는 것( 사용예로는 부모 인스턴스로 자식이 정의된 함수 접근 가능)

* 순수가상함수가 포함된 클래스를 추상클래스라고 한다

virtual void Sum()

가상 함수 : 자식이 정의할 것을 기대하는 함수 자식에서 구현안해도 상관은 없다 (사용예로는 오버라이딩: 동일하게 구현하여 정의만 바뀔때)

 

가상함수 테이블

가상함수 클래스 마다 가상함수 테이블(vftable)을 갖게된다. 그리고 가상함수 테이블을 가리키는 vptr을 생성하게 된다

가상함수가 포함된 클래스 vptr변수로 vtable을 참고하게 된다. 바로 호출되지 않고 두 번의 접근을 통해 성능상으로는 비효율적일수 있지만 다형성의 장점을 가지게된다.

 

 

참고 사이트 https://ospace.tistory.com/216

 

가상함수 구조

C++를 하다보면, 가상함수 호출하는 방식이 궁금했었다. 어떻게 다른 클래스로 캐스팅해서 원하는 가상함수를 호출하는지 정말 신기했다. 그래서 찾아봤다. 작성: http://ospace.tistory.com/,2010.12.07 (ospace1..

ospace.tistory.com

 

가상함수 소멸자

부모클래스의 생성순서는 부모클래스 - 자식클래스이고, 소멸순서는 자식클래스 - 부모클래스이다

하지만 상속의 관계에서 부모 클래스에 소멸자에 virtual을 써주지 않게되면 부모의 소멸자만 호출하게된다.

#include <iostream>
using namespace std;
class Parent
{
public:
	Parent() 
	{
		cout << "Parent Create" << endl;
	}
	virtual ~Parent()
	{
		cout << "Parent Delete" << endl;
	}
	virtual void Func1()
	{
		cout << "Parent Func1" << endl;
	}
	void Func2()
	{
		cout << "Parent Func2" << endl;
	}
};

class Child : public Parent
{
public:
	Child()
	{
		cout << "Child Create" << endl;
	}
	~Child()
	{
		cout << "Child Delete" << endl;
	}
	void Func1()
	{
		cout << "Child Func1" << endl;
	}
	void Func2()
	{
		cout << "Child Func2" << endl;
	}
};
int main()
{
	Parent *parent = new Child();
	parent->Func1();
	parent->Func2();
	delete parent;
	return 0;
}

소멸자에 virtual을 써준경우의 결과값
소멸자에 virtual을 써주지않았을때의 결과값

반응형

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

C++ 언어의 특징  (0) 2019.11.13
인터페이스 vs 추상화  (0) 2019.10.30
탬플릿  (0) 2019.10.30
참조형 변수  (0) 2019.10.28