본문 바로가기

C & C++/C++

[C++] virtual 가상함수 (생성자)

반응형

 

가상함수: 기본 클래스의 멤버함수를 정의할때 그 함수가 가상함수라면, 파생클래스가 상속받았을때 재정의되는 함수

 

 

  • 일반 상속관계 class

class AAA{
public:
	void Print() {
		cout << "AAA Print함수 콜" << endl;
	}
};

class BBB : public AAA{
public:
	void Print(){
		cout << "BBB Print함수 콜" << endl;
	}
};

int main(void){
	AAA* vertual_val;
	AAA chk1;
	BBB chk2;

	vertual_val = &chk1;
	vertual_val->Print();
    
	vertual_val = &chk2;
	vertual_val->Print();

	return 0;
}

결과:

AAA Print함수 콜

AAA Print함수 콜

 

 

  • virtual 함수를 사용한 상속 class

class AAA{

public:
	virtual void Print() { //가상함수
		cout << "AAA Print함수 콜" << endl;
	}
};

class BBB : public AAA{
public:
	virtual void Print(){ //가상함수
		cout << "BBB Print함수 콜" << endl;
	}
};

int main(void){
	AAA* vertual_val;
	AAA chk1;
	BBB chk2;

	vertual_val = &chk1;
	vertual_val->Print();
    
	vertual_val = &chk2;
	vertual_val->Print();

	return 0;
}

결과:

AAA Print함수 콜

BBB Print함수 콜

 

 

부모클래스의 함수가 가상함수일 경우 오버라이딩된 자식클래스 함수에 정의를 한다고 할 수 있습니다.

가상함수에서는 함수의 선언만하고 정의는 오버라이딩된 자식클래스의 함수에 정의

 

 

 

 

 

소멸자 참고

https://coding-house.tistory.com/29

 

[C++] virtual 가상함수 (소멸자)

소멸자 virtual을 쓰는 이유는? 상속하고 있는 클래스를 타입이 다른 포인터로 소멸할때 virtual이 없으면 오버라이딩 현상이 적용되지 않아 메모리 해제에 있어 메모리 누수(leak) 발생 class classA{ public: c..

coding-house.tistory.com

 

 

반응형