현재의 표준 C++에서는 부모 클래스의 특정 멤버를 오버라이드 할 때 virtual을 앞에 붙입니다.
struct Base
{
virtual void foo( int i );
};
struct Derived : Base
{
virtual void foo( int i );
}
위의 예제와 같은 작은 코드를 만질 때는 실수를 하지 않지만 실제 일을 할 때는 크고 많은 클래스를 다루다 보면 실수를 할 수 있습니다. 위 예제의 경우 아래와 같은 실수를 할 수 있습니다.
struct Derived : Base
{
virtual void foo( float i );
}
위와 같이 실수를 하면 Derived의 foo 멤버함수는 Base의 foo 멤버함수를 오버라이드 하지 않게 됩니다. 이런 실수는 에러가 아니기 때문에 골치 아픈 삽질을 할 수도 있습니다.
이런 문제를 방지하기 위해서 override가 새로 생겼습니다.
struct Derived : Base
{
virtual void foo( float i ) override;
}
이렇게 override를 사용하게 되면 컴파일 할 때 Base 클래스에
void foo( float i )가 없는데 오버라이드 한다고 에러를 발생시켜 줍니다.
때로는 Base 클래스의 특정 멤버함수를 Derived 클래스에서 오버라이드 하지 못하도록 막고 싶은 경우가 있을 것입니다. 이때는 final을 사용합니다.
struct Base
{
virtual void foo( int i ) final;
};
struct Derived : Base
{
virtual void foo( int i );
}
위의 코드에서는 Base 클래스의 foo 멤버함수를 final로 오버라이드 못하도록 해 놓았기 때문에 컴파일을 하면 에러가 발생합니다.
참고
위키피디아 http://en.wikipedia.org/wiki/C%2B%2B0x
'C++0x' 카테고리의 다른 글
[미리 보는 C++11] 4. constexpr - 2 (0) | 2011.09.23 |
---|---|
[미리 보는 C++11] 3. constexpr - 1 (1) | 2011.09.15 |
[미리 보는 C++11] 1. UTF-8, UTF-16(char_16t), UTF-32(char32_t) 문자형 (7) | 2011.08.22 |
C++0x가 드디어 C++11이 되었습니다. (0) | 2011.08.15 |
[STL] 15. VC++ 10에 추가된 새로운 컨테이너 forward_list – 사용편 (0) | 2011.06.21 |