2016-08-24 7 views
5

:C++ 공통 가상베이스 클래스 두 클래스의 특정 가상 상속 차이

class Base {}; 

class Derived1 : public virtual Base {}; 

class Derived2 : public virtual Base {}; 

이 두 상기 파생 된 클래스의 차이?

  • class Derived3 : public virtual Base, public Derived1, public Derived2 {}; 
    
  • class Derived3 : public Derived1, public Derived2 {}; 
    
거기

첫 번째는 또한 가상 기본 c에서 직접 파생됩니다 아가씨,하지만 그게 효과가 없다고 생각합니다. 왜냐하면 그것은 Derived1Derived2으로 공유되어 있기 때문입니다.

답변

2

그들은 똑같은 말을합니다. 유일한 차이점은 Derived3의 두 정의에서 public Derived1public Derived2을 제거하면 첫 번째 것은 여전히 ​​Base에서 상속 받고 두 번째 것은 상속되지 않는다는 것입니다.

편집 : 나는 거기에 있다고 생각하지 않지만 두 사람이 다르게 행동하는 이상한 크로스 캐스트 상황이 있는지 여부를 신중하게 생각하지 않았습니다.

2

이러한 예에는 차이점이 없습니다.

그러나 더 복잡한 시나리오에서는 상속 된 가상 기본을 직접 상속하면 기본 클래스 하위 개체의 생성/삭제 순서가 변경 될 수 있습니다.

1

가상 상속의 의도는 Base (또는 1의 경우 3 부)의 복사본 두 개를 가지지 않으므로 개체 레이아웃에 차이가 있다고 생각하지 않습니다.

그래서 모든 차이점은 의도와 코드의 가독성에 달려 있습니다.