가상 상속은 클래스가 Foo
에서 상속되는 경우에만 관련이 있습니다.나는 다음을 정의하는 경우 :
class B {};
class L : virtual public B {};
class R : virtual public B {};
class D : public L, public R {};
그런 다음 최종 객체는 모두
L
및
R
공유
B
의 사본을 포함합니다.
virtual
이 없으면
D
유형의 객체는 두 개의 복사본
B
을 포함하고 하나는
L
, 하나는
R
입니다.
모든 상속이 가상이어야한다는 인수가 있습니다 (차이가있는 경우 이 있으므로 대부분의 시간은 입니다). 그러나 실제로 가상 상속은 비싸며 대부분의 경우 일 필요는 없습니다. 잘 설계된 시스템에서는 대부분 계승이 단순히 하나 이상의 계승 된 구체적인 클래스가 될 것입니다. 그러한 구체적인 클래스는 일반적으로 에서 파생되지 않으므로 아무런 문제가 없습니다. 하지만 중요한 것은 예외입니다. 예를 들어 인터페이스를 정의한 다음 인터페이스를 확장하면 구체 구현으로 에 여러 확장을 구현할 수 있기 때문에 확장은 기본 인터페이스에서 실질적으로 을 상속해야합니다. 또는 믹스 인을 디자인하는 경우 일부 클래스는 인터페이스의 일부만 구현하고 나머지는 클래스는 이러한 클래스 중 일부 ( 인터페이스의 일부분)를 상속합니다. 상속이 공개되지 않은 경우
가
, 그것은 아마도 가상 안 (나는 본 적이 : 결국, 여부에로 criteron 사실상 여부가 너무 어려운 일이 아니다 상속하는 예외), 클래스는 기본 클래스로 설계되어 있지 않은 경우, 그렇지 않으면
, 그렇지 않으면
상속 가상 있어야 가상 상속에 대한 필요가 없습니다.
이 몇 가지 예외가 있지만, 위의 규칙은 안전의 측면에 잘못; 가상 상속이 필요하지 않은 경우에도 사실상 상속하는 것이 "정확합니다".
마지막 요점 : 가상 기본은 항상 하지 직접 상속 (그리고 상속 가상 함을 선언합니다) 클래스, 가장 파생 클래스에 의해 초기화해야합니다. 그러나 실제로 이것은 문제가 아닙니다. 가상 상속이 적합한 경우를 보면 항상 데이터를 포함하지 않는 인터페이스에서 상속하는 경우이므로 기본 생성자 만 있습니다. 이 실질적으로 생성자가있는 클래스에서 상속 받았다고 생각하면 인수를 사용하므로 디자인에 대해 심각한 질문을 할 때입니다.
주제가 너무 얕아서는 안되기 때문에 대답하지 않을 것입니다.하지만 '가상'이 없으면 '막대'를 상속 한 각 클래스는 '가상'이있는 '막대'의 사본을 갖게됩니다. 가장 많이 파생 된 클래스에는 'Bar'복사본이 하나만 있습니다. –
시도 : [이 검색] (http://stackoverflow.com/search?q = 가상 + 상속 + % 5Bc % 2B % 2B % 5D) –
가능한 복제본 [In C++ 가상 기본 클래스?] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class) –