2012-11-14 8 views
2

명시 적으로 기본 클래스를 C++에서 추상으로 선언 할 수 있습니까?명시 적으로 추상 기본 클래스 선언

클래스로 추상 클래스를 암시 적으로 선언 할 순수 가상 함수를 만들 수 있다는 것을 알고 있습니다. 그러나 파생 클래스에서 정의하기 위해 더미 함수를 생성하지 않아도됩니다.

개체의 인스턴스화를 막을 수있는 생성자를 보호 할 수도 있지만 실제로는 클래스를 추상으로 표시하지는 않습니다.

그래서이 방법이 있습니까? (나는 C++ 11을 사용하고 있는데, 그렇게 할 수있는 방법이 추가 되었다면, 오른쪽으로 보이는 것을 찾지 못했다.)

답변

3

소멸자를 순수 가상으로 만들 수있다.

struct Foo 
{ 
    virtual ~Foo() = 0; 
}; 

inline Foo::~Foo() { } 

(. 당신이 하나를 제공해야하므로, 소멸자의 구현을 필요 물론 할 아웃 오브 라인)

당신 : 당신은 항상 소멸자를 필요로하기 때문에, 추가 정신적 비용이 없습니다 여전히 소멸자를 만들 수 있습니다 protected, 이는 "비 리프 클래스 추상화"규칙에 뒤 따르는 좋은 습관입니다.

예 :

struct Bar : Foo { }; 

// Foo f; // Error, Foo is abstract 
Bar b;  // OK 
+0

와우, 그게 효과가 있니? 'Foo' 디시 컨스터는'Bar'가 해체 될 때 여전히 호출됩니다. – Xymostech

+0

@Xymostech : 당연히 :-) (* 모든 * 순수 가상 함수에 대한 정의를 제공 할 수 있습니다.) –

+0

흥미 롭습니다. Clang이'Foo '를 만들려고 시도 할 때'Foo'에'Foo '라는 미완성 순수 가상 메소드'경고 : Clon이 경고를주었습니다. – Xymostech

1

명시 적으로 C++ 추상 같은 기본 클래스를 선언하는 방법이 있나요?

아니요, 없습니다. 클래스는 하나 이상의 추상 메소드가 선언되어있는 경우에만 추상 클래스입니다. 기본 클래스가 직접 인스턴스화되지 않도록하려면 보호 된 생성자를 선택하는 것이 좋습니다.

1

저는 Kerrek의 대답을 좋아합니다. 그런 식으로 클래스를 인스턴스화 할 수 없으므로 추상 클래스입니다.

그러나 클래스의 전체 선언을 검사하고 소멸자가 가상이라는 사실을 알기 전에는 클래스가 추상이라는 것이 분명하지는 않습니다.

내가 가진 또 다른 아이디어는 #define을 사용하여 "추상"이라는 단어에 대한 사전 처리기 정의를 만들 수 있다는 것입니다.

struct Foo {}; 

나는이 함께 볼 수있는 문제는이 추상적으로 클래스를 강요하지 않는 것보다 더 다르지 않을 것이다

abstract struct Foo {}; 

: 그래서, 당신은 다음과 같은 일을 할 수있는이 방법 매크로를 사용하여 가상 소멸자를 선언 할 수도 있습니다. 같은 뭔가 : 다음

#define ABSTRACT_CLASS(class_name) \ 
    class class_name { \ 
    virtual ~class_name() = 0; // 

그리고 지금처럼 사용

class foo { 
    virtual ~class_name() = 0; // { 
    // class declaration 
}; 

면책 조항 :로 전환 될

ABSTRACT_CLASS(Foo) { 
    // class declaration 
}; 

내 매크로는 약간 떨어져있을 수 있습니다. 그것은 실제로 변수 이름을 만지는 ~ 및() 함께 class_name 붙여 넣을 경우 확실하지 않습니다.또한, 내가 직접 할 수 있을지 확신 할 수 없다. 가장 아름다운 해결책은 아니며, 특히 중괄호를 주석 처리하면 다음 줄에 넣으면 작동하지 않을 것이다. 하지만 당신은 추상적 인 것으로 표시 할 수있는 방법을 물었고 나는 그것을 당신에게주었습니다!

관련 문제