"불순한 가상 함수"는 진단 목적으로 (http://www.gotw.ca/gotw/031.htm에 설명 된대로) 구현 된 순수 가상 함수를 의미합니다.이것은 불순한 가상 함수를 구현하는 합법적 인 방법입니까?
을 구현하는 산뜻한 방법은하는 것입니다 :
class Foo
{
public:
...
virtual void Bar() = 0;
};
void Foo::Bar() { assert(false); }
을하지만이 클래스가 순수 가상 메소드를 가지고 특히 들어 가지 지루한입니다. 또한 누군가가 실수로 해당 구현을 추가하지 않고 새로운 순수 가상 함수를 추가하지 않도록하는 것은 어렵습니다.
class Foo
{
public:
...
virtual void Bar() = 0
{
assert(false);
}
};
하지만 C++ 표준은 명시 적으로합니다 (ISO C++ 2003 표준 섹션 10.4/2)을 허용하지 :
이상적으로 내가 뭘하려는 것입니다.
대신 다음과 같은 해킹을 생각해 보았습니다. 해당 Foo.cpp
소스 파일에서 다음
#ifndef ABSTRACT_METHOD
#define ABSTRACT_METHOD = 0
#endif
class Foo
{
public:
...
virtual void Bar() ABSTRACT_METHOD;
};
과 : 그것은 하나의 컴파일 된 구현을 얻을 수 있도록
#define ABSTRACT_METHOD { assert(false); }
#include "Foo.h"
...
Foo.h
헤더합니다.
그렇게 합법적일까요?
음, 소스 파일에';'가 쓰여질 것입니다 ... –
@Oli Charlesworth : 사실, 그렇지만 본질적으로 잘못된 점이 있습니까? 어쨌든 후행하는';'에 대한 책임을 매크로 정의로 옮김으로써 쉽게 피할 수 있습니다. – jamesdlin
@james : 예, 저는 이것이 컴파일러 오류라고 생각합니다. 나는 그것이 쉽게 해결할 수 있다는 것을 알고 있지만 이것은 부수적 인 관찰 이었지만 비판은 아니었다. –