override
꽤 갈망해왔던 키워드이다.
base class에 있는 virtual을 상속받아서 쓰는경우에 base class에 있는 함수를 바꾸고 drived class 의 함수를 바꾸지 않았을 때 오작동하는 잡기 쉽지 않은 버그가 컴파일할때 에러가 나주면 얼마나 감사할까... 할 때 쓰시면 된다.
struct AAA
{
virtual void f();
};
struct BBB : public AAA
{
virtual void f() override {} // OK
virtual void f2() override {} // error C3668: 'BBB::f2' : method with override specifier 'override' did not override any base class methods
};
abstract
virtual foo() = 0;
대신에
virtual foo() abstract;
로 쓸 수 있다.
함수에서는 별 필요 없지만 클래스 에서는 강력하게 사용할 수 있다.
class X abstract {};
int main()
{
X * MyX = new X; // C3622 cannot instantiate abstract class
}
이런식으로 class 통째로 abstract기능을 걸 수 있다.
인터페이스 class 를 만들 때 유용할 듯...이라고 생각할 수 있지만 인터페이스 클래스는 __interface 키워드가 있으므로 걍 추상 클래스에만 사용하쟈...
사실 인터페이스용으로 사용해도 내용으로는 구분이 안되는 내용이지만 알아서 구분해 쓰자
__is_abstract(type) 으로 컴파일 타임 체크 가능
__interface
__interface I1
{
virtual void f();
};
위의 abstract 키워드로 선언한 class 와의 차이
멤버변수를 가질 수 없다.
static류를 사용할 수 없다.
생성자, 파괴자, 오퍼레이터 오버로딩 불가(엑-.ㅜ 인터페이스 클래스에서 이거 꽤 쓰는데..;;)
인터페이스는 상속 가능, base class는 상속 안됨
public pure virtual함수만 가질 수 있음
장점은 virtual table을 차지하지 않음
sealed
더이상 오버라이딩 못하게 할 때 사용한다.
함수와 클래스 둘 다 사용가능
__is_sealed (type) 으로 컴파일 타임 체크 가능
.끝.
native 기준이고 CLR 에서만 사용가능한건 적지 않았음
위에 몇 개 나왔지만 __is_abstract 같은 컴파일 타임에 사용가능한 TypeTraits 가 꽤 있다.
특정 클래스가 base 클래스를 상속 받았는지를 체크하는것도 있고(CLR에서만 되지만)
__has_copy(type) 나 __has_assign(type) 같은
native에서 쓸만한 것도 꽤 있다.
근데 사실 TypeTraits 는 필요한건 native 지원 안하면 loki를 써버리면 그만
'Programming > C / C++' 카테고리의 다른 글
bitset (0) | 2015.02.07 |
---|---|
const 를 이용한 포인터 상수화 (0) | 2015.02.07 |
switch 분할 호출 (0) | 2015.02.07 |
가변 인수 (0) | 2015.02.07 |
STL without warnings (0) | 2015.02.07 |