문제

나는이 문제에 두 번 이상 잡혔다.

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

함수가 순수한 가상 인 경우 컴파일러는 오류를 포착합니다. 그러나 이것이 아니라면 추적하는 끔찍한 버그가 될 수 있습니다. 문제의 일부는 기능 이름이 너무 길다는 것입니다. 그러나 여전히이 버그를 더 일찍 볼 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

한 가지 가능성은 구현과 함께 거의 사용되지 않은 순수한 가상 기능입니다.

virtual int longDescriptiveName() = 0
{
    return 0; 
}

이로 인해 수업을 파생시킵니다. 그런 다음 해당 동작 만 원한다면 기본 등급 구현 만 호출 할 수 있습니다.

또한 상속 계층 구조가 다중층보다는 평평한 지 확인해야합니다. 이는 상속이 레이어에 쌓이지 않고 충분히 연약하기 때문에 일반적으로 좋습니다.

다른 팁

Microsoft Visual C ++ 2005 또는 새로 사용하면 비표준 확장 글을 쓸 수 있습니다.

virtual int longDescriptveName() override { return 1; }

그리고 컴파일러는 불평합니다. 다른 컴파일러와 함께 컴파일하는 경우 #Define을 만들어 동작을 제어 할 수있는 것이 현명 할 것입니다.

오래된 Necro'd 질문이지만 한 가지 좋은 방법은 수업을 사용하기 전에 공식적으로 단위 테스트 또는 비공식적으로 일찍 테스트하는 것입니다. 다시 말해, 일찍 확인하십시오.

A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);

~ 전에 클래스를 사용하는 10,000 줄의 코드를 작성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top