virtual 키워드를 사용해야 하는 이유
2019. 10. 17. 00:28ㆍPL/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 |