틀린 가상 기능 감지
-
19-09-2019 - |
문제
나는이 문제에 두 번 이상 잡혔다.
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 줄의 코드를 작성합니다.
제휴하지 않습니다 StackOverflow