Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- IK
- IKSolver
- TwoBoneIK
- final
- ComputerGraphics
- FABIK
- 상속
- Override
- 클래스
- c++
- C++ #개발자 #Modern_C++ #스마트포인터 #Smart_Pointer #unique_ptr # shared_ptr # weak_ptr
- Modern C++
- InverseKinematics
- CCD
- Kinematics
- C++11
- FABRIK
- ImageProcessing #ComputerGraphics #ComutationalPhotography #PoissinImageEditing #Siggraph2003
Archives
- Today
- Total
DevNote
[C++ 11] final과 override의 차이 본문
C++에서도 클래스 간의 상속에 관해 명시적으로, 그리고 효율적으로 대처할 수 있는 키워드가 있다.
(Java의 Interface, final 이나 C#의 Sealed같은 기능을 제공해주는 키워드 같은게 C++11에서 추가됨)
그것이 바로 final과 override 키워드 두 가지이다.
이 두 개의 키워드를 통해 이전의 C++에서보다 더 정교하게 상속을 다룰 수 있게 되었다.
Keyword | Desc |
final | - 상속을 차단할 때 사용, final로 선언된 클래스는 상속이 불가. |
override | - 부모 클래스의 멤버 함수를 명시적으로 overrding 하기 위해 사용 - 상속 구조에서 파생 클래스 내에서 override로 선언된 멤버 함수는 부모 클래스의 멤버 함수를 명시적으로 overriding 한다. |
두 키워드에 대한 이해를 돕기 위해 아래의 예제를 보도록 합세다.
<final 예제>
class Base1 final
{
public:
Base1();
virtual ~Base1();
void Func(String InParam);
};
class Base2
{
public:
Base2();
virtual ~Base2();
void Func(String InParam) final;
}
class Derived : public Base2
{
Derived();
virtual void Func(String InParam) override; // Error!!!
};
예제 설명
- Base1 클래스는 final로 선언되었기 때문에 상속이 불가능하다.
- Base2 클래스의 Func 멤버 함수는 final로 선언되었기 때문에 Derived 클래스에서 Func 멤버 함수에 대한 overriding이 불가능하다.
<override 예제>
class Base
{
public:
Base();
virtual ~Base();
virtual void Func(String InParam);
}
class Derived : public Base
{
Derived();
virtual void Func(String InParam) override;
};
예제 설명
- Base3 클래스에는 Func라는 멤버 함수가 가상으로 선언되었고,
Base3을 상속받은 Derived 클래스에서 Func 멤버 함수를 override로 선언해줌으로써 부모 클래스의 멤버 함수를 명시적으로 overriding 한다는 것을 보장한다.
- override의 실용성 : 부모 클래스의 멤버 함수를 overriding 할 때, 흔히 저지를 수 있는 실수가 바로 시그니처를 맞춰주지 않는 것이다. 이 때, override 키워드로 명시해주면 사용자가 저지를 수 있는 실수를 컴파일러가 잡아준다.