this entry에서 가상 상속은 객체의 메모리 풋 프린트에 sizeof (포인터)를 추가합니다. 그 외에도 기본적으로 가상 상속을 사용하고 필요한 경우에만 기존 상속을 사용한다는 단점이 있습니까? 그것은 더 미래 지향적 인 클래스 디자인으로 이어질 것 같지만 어쩌면 나는 몇몇 함정을 놓치고 있습니다.C++에서는 거의 항상 가상 상속을 사용해야합니까?
답변
단점이
- 모든 클래스는 항상 모든 가상베이스를 초기화 할 수있을 것이라는 점이다 (예를 들면, 이는 또한 자체 초기화해야).
static_cast
을 사용하는 모든 곳에서 더 비싼dynamic_cast
을 사용해야합니다 (시스템 및 디자인에 필요한지 여부에 따라 문제가 될 수도 있고 아닐 수도 있습니다).
포인트 1만으로는 가치가 없습니다. 가상 기반을 숨길 수 없기 때문입니다. 거의 항상 더 좋은 방법이 있습니다.
오 하나님 (1)은 끔찍합니다. 감사! 당신은 (2)에 대해 더 명시 할 수 있습니까? static_cast
@SuperElectric : 왜 (1) 끔찍한가요? 기본 하위 객체가 초기화되지 않은 것이 더 좋을까요? ;) – Yttrill
가상 기지의 목적을 완전히 이해하지 못했음을 보여주는 "가치가 없다"는 코멘트 : 가상 상속은 추상화를 하위 클래스로 분류 할 때 반드시 사용해야합니다. 해결 방법이나 다른 가능성은 없습니다. 사용하지 않으면 디자인 오류를 수정하지 않고 캡슐화를 중단하지 않고 여러 추상화 서브 클래 싱을 사용할 수 없습니다. – Yttrill
제 경험상 가상 상속 (가상 메서드과 반대)은 거의 필요하지 않습니다. C++에서 "diamond inheritance problem"을 처리하는 데 사용됩니다.이 경우 다중 상속을 피하면 실제로 발생할 수 없습니다.
나는 내가 작성한 코드와 100 만 개가 넘는 라인 시스템을 모두 포함하는 C++ 서적 이외의 가상 상속을 경험하지 못했다고 확신한다. A가 B의 가상베이스이고, C가 B로부터 파생되는 경우
표준 C++ I/O 스트림 라이브러리는 가상 상속을 사용합니다. 하지만 그 외에는 일반적으로 매우 드뭅니다. –
그렉 : 전체 가상 상속 혼란에 +1 우수한 일반화. –
흠 ... 나는 그것이 무엇인지 알고있다. (나는 그것을 사용하려고 생각하고있다.) 나는 드물다. (나는 C++로 코딩한다.) 그러나 "가상 상속의 단점은 무엇인가"라는 질문이 제기되었다. – SuperElectric
기본 클래스의 초기화 순서는 대부분의 사람들에게 분명하지 않습니다. 따라서 유지 비용이 증가합니다. –
가상 상속은 일부 구현에서만 내부 포인터를 추가합니다. Itanium ABI는 내부 포인터를 사용하지 않으며 vptr 만 사용합니다. – curiousguy