problema deriva sobre c ++
-
19-09-2019 - |
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;
}
};
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;)