Pergunta

Por que eu não posso acesso classe base de um membro na lista de inicialização de classe B?

   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;
        }
    };
Foi útil?

Solução

O construtor de A é executado antes do B, e, implícita ou explicitamente, o ex-construto todas instância de A, incluindo o membro a. Portanto B não pode usar um construtor em a, porque esse campo já está construído. A notação que você está tentando usar indica exatamente para usar um construtor em a, e nesse ponto é simplesmente impossível.

Outras dicas

Para construir sobre Alex' resposta, você pode inicializar a classe base "a" membro controlando sua construção, assim:

class B : public A
{
public:
    explicit B(int a1) : A(a1) { }  // This initializes your inherited "a"
    ...
};

Note que eu estou construindo a classe base (capital "A" ) acima, em vez de tentar inicializar diretamente seu membro herdado (em minúsculas "a" , desenho a partir de seu exemplo).

Para construir ainda mais sobre a resposta de Pilcrow, você poderia facilmente inicializar o membro A como você quer, substituindo-o em sua classe B:

class B : public A
{
public:
    int a; // override a

    explicit B(int a1) : a(a1) // works now
    {
    }

    ...
};

Embora, eu não necessariamente recomendo este;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top