2009-06-08 6 views
5

몇 가지 순수 가상 함수를 가진 추상 클래스가 있는데 순수 가상 함수 중 하나를 사용하지 않는 클래스 중 하나는 다음과 같습니다.순수 가상 함수를 "삭제"하는 방법이 있습니까?

class derivative: public base 
{ 
public: 
    int somevariable; 
    void somefunction(); 
}; 

어쨌든 컴파일하려고하면 오류 (명백하게, 추상 클래스에서 파생되고 모든 순수 가상 함수를 무시하지 않으면 클래스는 여전히 추상으로 간주됩니다.) 어쨌든

int purevirtfunc(){return 0;} 

함수를 정의하는 것은 무의미한 것처럼 보입니다. 단지 전문성을 통해 정의해야하기 때문입니다. 어쨌든 추상 클래스에서 클래스를 파생시키고 추상 클래스의 순수 가상 함수 중 하나를 사용하지 않습니까?

+6

방법이 있다면 구현되지 않은 코드 중 하나가 코드라고하면 어떻게 될 것으로 예상됩니까? – Aardvark

답변

40

파생 클래스가 기본 클래스 순수 가상 함수를 "사용"하지 않으면 파생 클래스가 기본에서 파생되지 않아야하거나 PVF가 없어야합니다. 두 경우 모두 디자인에 오류가있어 다시 생각해야합니다.

아니요, PVF를 삭제할 방법이 없습니다.

1

순수 가상 함수가있는 클래스를 상속하는 경우 해당 함수를 구현해야합니다. 그렇지 않으면 파생 클래스도 추상 클래스이므로 파생 클래스의 객체를 만들 수 없습니다.

+0

이 인터페이스에서 자주 상속을 받으면 스텁 아웃 (stubbing out)을 수행하는 상속 (null from) 구현을 만들 수도 있습니다. –

9

추상 클래스에서 파생되는 목적은 외부 코드가 추상 클래스를 사용할 수 있고 모든 함수가 올바르게 구현되었다는 것입니다. 메소드를 구현할 수 없으면이 목적을 무효화하여 코드를 편집 할 수 없게 만듭니다. 그러나 그렇게 선택하면 예외를 던질 수 있습니다.

1

아니요. 제안한대로 기본 클래스에서 기본 구현을 제공하거나 파생 클래스에서 간단한 구현을 제공하십시오.

14

순수 가상 클래스는 코드가 수행 될 것으로 예상되는 인터페이스입니다. 해당 인터페이스를 구현하고 메소드 중 하나를 구현하지 않으면 어떻게됩니까? 인터페이스를 호출하는 코드가 메서드를 구현하지 않았다는 것을 어떻게 알 수 있습니까?

수있는 옵션은 다음과 같습니다 (비공개는 사용할 수 없습니다 것을 나타냅니다 만들기) 기술로

  1. 메소드를 구현합니다.
  2. 디자인 변경을 고려하여 클래스 계층 구조를 변경하십시오.
5

전혀 전문적인 내용이 아닙니다. 파생 클래스가 부모의 모든 동작을 나타내지 않으면 부모로부터 파생되지 않아야합니다. 이것은 주요한 디자인 냄새이며, 아마도 약간의 디자인 리팩토링이 필요할 것입니다.

0

허용하는 것은 의미가 없습니다. 구현없이 함수를 호출하면 어떻게 될까요? 런타임 오류 (어리석은)? 어떤 경우 컴파일 타임 오류가 발생할 수 있다고 주장 할 수 있지만, 정확한 유형을 알 수없는 경우 (예 : 파생 클래스의 인스턴스에 대한 포인터를 함수에 전달한 경우) 불가능합니다.

1

이미 좋은 답변이 있지만 이론적 인 OO 설계 측면에서 자세한 정보가 필요하면 Liskov substitution principle을 확인하십시오.

0

많은 사람들이 이미 언급했듯이 기본 메서드가 순수 가상이 아니어야하거나 파생 클래스가 실제로 ISA 기반인지 여부를 다시 생각해야합니다.

그러나 기본 클래스의 순수 가상 메서드 구현을 제공 할 수 있습니다. 이는 파생 클래스의 기본 구현처럼 작동 할 수 있지만 파생 클래스가 기본 클래스의 구현을 명확하게 선택해야합니다.

당신의 문제에 도움이되는지 아닌지는 잘 모르겠다.

-1

당신은

class Foo { 
public: 
    virtual void foo() = 0; 
}; 

class Bar { 
public: 
    virtual void foo() = delete; 
}; 
0

아니,이 없다 할 수 없습니다. 이러한 상황이 발생하면 늦은 언어로 진행되는 국제 대회 (합법적 인 경우 일지라도이 방법을 다른 곳으로, 즉 추상 클래스로 옮길 수 있는지 여부를 고려하여 디자인을 고려해야합니다.) 예외를 발생시키고 해당 사용자가 메서드는 일부 구현에서 해당 예외가 발생할 수 있음을 알고 있습니다.

관련 문제