Eu tenho este código de exemplo:
#include <iostream>
class A
{
public:
A()
{
std::cout << "Default constructor of A" << '\n';
}
A(int i)
{
std::cout << "Inside the constructor of A with one int argument" << '\n';
}
A(double i)
{
std::cout << "Inside the constructor of A with one double argument" << '\n';
}
};
class B : A
{
using A::A;
public:
B()
{
std::cout << "Default constructor of B" << '\n';
}
};
int main()
{
B b(12);
std::cout << "End of main";
}
E a saída é:
Inside the constructor of A with one int argument
End of main
Entendo por que B
o construtor s não é chamado (consulte Herança do construtor em C++. O construtor padrão da classe derivada não está sendo chamado ) e posso escrever a B(int)
, mas o problema é que A
tem muitos construtores e ao construir um B
quero que o A
construtor correspondente seja chamado e um B
construtor específico.
Como posso conseguir isso sem escrever um B
construtor para cada A
construtor?
Em outras palavras, quero que a saída B b(12)
seja
Inside the constructor of A with one int argument
Default constructor of B
End of main
e também B b(4.2)
para ser
Inside the constructor of A with one double argument
Default constructor of B
End of main
sem reescrever o construtor B
muitas vezes.
Uma solução é usar um construtor de encaminhamento na classe derivada que encaminhe todos os parâmetros para a classe base. Isso lhe daria
que ao usar
saídas
como visto neste exemplo ao vivo .
Isso vem com a ressalva de que nenhuma conversão implícita acontece com um modelo, portanto, se você tentar usar
porque
A
pode ser construído com, digamos, um vetor, então ele não será compilado porque{foo, bar, baz}
não tem tipo.Em vez de fazer o trabalho diretamente
B
, você pode adicionar base/membro extra que faria o trabalho:E então também
ou
Demonstração