Em C++, você pode herdar todos os construtores de uma classe base escrevendousing Baseclass::Baseclass
Minha Baseclass tem um construtor padrão e outro que aceita um argumento int, embora este realmente não importe neste caso.
Mas por razões que não entendo, o construtor padrão herdado de alguma forma "desaparece" no momento em que tento adicionar meu próprio construtor à classe derivada. Por que isso acontece e qual é a melhor solução para contornar isso?
Considere o seguinte trecho de código:
#include <iostream>
#include <string>
using std::cout;
struct Base
{
Base() {};
Base(int i)
{
cout << i << " was called";
};
};
struct GoodDaughter : public Base
{
using Base::Base;
};
struct EvilSon : public Base
{
using Base::Base;
EvilSon(std::string q) {}; //define ANOTHER constructor
};
void testFamily()
{
Base b;
GoodDaughter g1; //compiles
EvilSon e1; //somehow doesn't compile, complains about no default constructor existing
GoodDaughter g2(1); //compiles
EvilSon e2(1); //compiles, which means that other constructor still got inherited.
}
A mensagem de erro é:
<source>(30): error C2512: 'EvilSon': no appropriate default constructor available
<source>(19): note: see declaration of 'EvilSon'
Estou usando a versão mais recente do MSVC 19. Algumas pessoas descobriram que outros compiladores, como o gcc, não davam esse erro
Cito aqui o comentário de Phil Christensen que explica a diferença entre c++11/14 (onde não compila) e padrões posteriores no compilador msvc: