가능한 중복 : 나는 복수를 사용할 때 컴파일러가 서로 다른 초기 값을 처리 할 방법에 대해 궁금하네요 안녕하세요
gcc c++ virtual inheritance problem가상 기본 클래스 및 초기화 목록
,
가상 기본 클래스의 상속. 상속 방식 악명 높은 '공포의 다이아몬드'를 고려 Join
에 Base
2 부 것을 방지하기 위해
Base
/\
/ \
D1 D2
\ /
\/
Join
, 나는 (예를 들어, here 참조) D1
및 D2
가상 상속을 사용합니다. 이제 Base
추상적 아니라고 할 수 있지만 생성자에서 초기화되는 멤버 필드있다 :
class Base {
public:
Base(int x_) {x = x_;};
virtual ~Base(){};
public:
int x;
};
class D1 : public virtual Base {
public:
D1() : Base(1) {};
virtual ~D1(){};
};
class D2 : public virtual Base {
public:
D2() : Base(2) {};
virtual ~D2(){};
};
class Join : public D1, public D2 {
public:
Join(){};
~Join(){};
};
int main()
{
Join j;
cout << j.x << endl;
return 0;
}
출력이 1이 될 것인가를하거나 컴파일러 의존?
새로운 테스트 케이스 코드는'Join j; cout << j.x;'. –
@Charles,이 질문은 GCC와 관련이 없으므로 엄격하게 중복되지는 않습니다. 같은 문제를 다루지 만 대답은 컴파일러 독립적입니다. –
@ SergeyTachenov : 그 질문은 gcc에만 해당되는 것이 아니며, 단지 약간의 오해의 소지가있는 제목에 gcc가있는 것입니다. –