728x90
반응형
질문 : C ++에서 가상 기본 클래스 란 무엇입니까?
"가상 기본 클래스 "가 무엇이며 그 의미를 알고 싶습니다.
예를 하나 보여 드리겠습니다.
class Foo
{
public:
void DoSomething() { /* ... */ }
};
class Bar : public virtual Foo
{
public:
void DoSpecific() { /* ... */ }
};
답변
가상 상속에 사용되는 가상 기본 클래스는 다중 상속을 사용할 때 지정된 클래스의 여러 "인스턴스"가 상속 계층에 나타나는 것을 방지하는 방법입니다.
다음 시나리오를 고려하십시오.
class A { public: void Foo() {} };
class B : public A {};
class C : public A {};
class D : public B, public C {};
위의 클래스 계층 구조는 다음과 같은 "두려운 다이아몬드"를 생성합니다.
A
/ \
B C
\ /
D
D의 인스턴스는 A를 포함하는 B와 A도 포함하는 C로 구성됩니다. 따라서 A에 대한 두 개의 "인스턴스"(더 나은 표현을 원하는 경우)가 있습니다.
이 시나리오가있을 때 모호 할 가능성이 있습니다. 이렇게하면 어떻게 되나요?
D d;
d.Foo(); // is this B's Foo() or C's Foo() ??
이 문제를 해결하기 위해 가상 상속이 있습니다. 클래스를 상속 할 때 virtual을 지정하면 단일 인스턴스 만 원한다고 컴파일러에 알리는 것입니다.
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
이는 계층 구조에 포함 된 A의 "인스턴스"가 하나뿐임을 의미합니다. 그 후
D d;
d.Foo(); // no longer ambiguous
이것은 간단한 요약입니다. 자세한 내용은 this 및 this를 읽어보십시오. 여기 에서도 좋은 예를 볼 수 있습니다.
출처 : https://stackoverflow.com/questions/21558/in-c-what-is-a-virtual-base-class
728x90
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C ++ 식별자에서 "_"을 사용하는 규칙 (0) | 2021.07.09 |
---|---|
Visual Studio C / C ++ 콘솔 애플리케이션에서 콘솔 창이 닫히지 않도록 방지 (0) | 2021.07.09 |
C #에서 돈의 단위로 사용하기에 가장 좋은 데이터 유형 (0) | 2021.07.07 |
C ++에서 다른 생성자 (생성자 체인)에서 생성자를 호출 하는 방법 (0) | 2021.07.07 |
이 프로그램이 세 개의 C ++ 컴파일러에서 잘못 거부 된 이유 (0) | 2021.07.07 |