아마도 표준은 아닐거라고 생각하고 2003의 지원여부는 잘 모름-ㅅ-;
이미 표준이 아니어도 vc2005의 강력한 기능이 너무나도 유용한 경우는 생까주기로 하셨슴.
override
꽤 갈망해왔던 키워드이다.
base class에 있는 virtual을 상속받아서 쓰는경우에 base class에 있는 함수를 바꾸고 drived class 의 함수를 바꾸지 않았을 때 오작동하는 잡기 쉽지 않은 버그가 컴파일할때 에러가 나주면 얼마나 감사할까... 할 때 쓰시면 된다.
struct I1 {
virtual void f();
};
struct X : public I1 {
virtual void f() override {} // OK
virtual void f2() override {} // error C3668: 'X::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();
};
위의 abstrace키워드로 선언한 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를 써버리면 그만이라 헹~