문제

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
    {
    }

    ...
};

하지만 반드시 이것을 추천 할 필요는 없습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top