문제
Class B 초기화 목록에서 Base Class A의 A 회원에 액세스 할 수없는 이유는 무엇입니까?
class A
{
public:
explicit A(int a1):a(a1)
{
}
explicit A()
{
}
public:
int a;
public:
virtual int GetA()
{
return a;
}
};
class B : public A
{
public:
explicit B(int a1):a(a1) // wrong!, I have to write a = a1 in {}. or use A(a1)
{
}
int GetA()
{
return a+1;
}
};
class C : public A
{
public:
explicit C(int a1):a(a1)
{
}
int GetA()
{
return a-1;
}
};
해결책
A의 생성자는 B보다 먼저 실행되며, 암시 적으로 또는 명시 적으로 전자는 a
회원. 따라서 B는 생성자를 사용할 수 없습니다 a
, 그 필드는 이미 건설 되었기 때문에. 사용하려는 표기법은 생성자를 사용하여 정확히 사용합니다. a
, 그 시점에서 그것은 불가능합니다.
다른 팁
Alex의 답변을 구축하려면 기본 클래스를 초기화 할 수 있습니다. "ㅏ" SO와 같은 건축을 제어하여 회원 :
class B : public A
{
public:
explicit B(int a1) : A(a1) { } // This initializes your inherited "a"
...
};
기본 클래스 (자본 "ㅏ") 위의, 상속 된 멤버 (소문자 "ㅏ", 당신의 예에서 도면).
Pilcrow의 답변을 더욱 구축하려면 B 클래스에서 재정의하여 원하는 A 회원을 쉽게 초기화 할 수 있습니다.
class B : public A
{
public:
int a; // override a
explicit B(int a1) : a(a1) // works now
{
}
...
};
하지만 반드시 이것을 추천 할 필요는 없습니다.)
제휴하지 않습니다 StackOverflow