virtual 키워드를 사용해야 하는 이유

2019. 10. 17. 00:28PL/C++

상속 관계에서 오버라이딩을 하기 위해서는 반드시 virtual 키워드가 붙여져야만 한다. 이 문제는 부모 객체 포인터 변수로 자식 객체들을 제어하려고 할 때 문제가 나타난다

 

#include <iostream>

using namespace std;

class Base {
public:
	Base() {
		cout << "Base 생성자\n";
	}
	~Base() {
		cout << "Base 소멸자\n";
	}
	void Do() {
		cout << "Base 행동\n";
	}
};

class Derived : public Base {
public:
	Derived() {
		cout << "Derived 생성자\n";
	}
	~Derived() {
		cout << "Derived 소멸자\n";
	}
	void Do() {
		cout << "Derived 행동\n";
	}
};

int main(void) {
	Base* base = new Derived();
	base->Do();
	delete base;
	return 0;
}

 

부모 객체 포인터로 자식 객체를 생성하고 똑같이 정의된 함수인 Do를 호출하니 위와 같이 출력된다.

1. Derive 소멸자가 호출이 되지 않았다

2. 부모의 Do 함수가 호출됐다

 

이 문제를 해결하기 위해서 객체 간 함수를 구분하기 위해 virtual을 붙여야만 한다

 

#include <iostream>

using namespace std;

class Base {
public:
	Base() {
		cout << "Base 생성자\n";
	}
	virtual ~Base() {
		cout << "Base 소멸자\n";
	}
	virtual void Do() {
		cout << "Base 행동\n";
	}
};

class Derived : public Base {
public:
	Derived() {
		cout << "Derived 생성자\n";
	}
	virtual ~Derived() {
		cout << "Derived 소멸자\n";
	}
	virtual void Do() {
		cout << "Derived 행동\n";
	}
};

int main(void) {
	Base* base = new Derived();
	base->Do();
	delete base;
	return 0;
}

 

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

constexpr  (0) 2019.10.23
__cplusplus 매크로 의미  (0) 2019.10.19
temp 변수 없이 swap 하기  (0) 2019.10.16
C6011: NULL 포인터 'var'을 역참조하고 있습니다 에러 해결  (0) 2019.10.12
extern "C" 의미  (0) 2019.10.06