Вы должны явно вызвать конструктор базовой копии:
Teacher(const Teacher& other)
: Person(other) // <--- call Person's copy constructor.
, num_(other.num_)
{
}
В противном случае будет вызываться конструктор по умолчанию Person
.
Кажется, я не до конца понимаю вопрос, поэтому я просто скажу все, что считаю уместным, и, надеюсь, это поможет ОП.
Все определяемые пользователем конструкторы вызывают конструктор по умолчанию своей базы (если они явно не вызывают другой конструктор), не имеет значения, определен ли конструктор базы по умолчанию пользователем или генерируется компилятором.
Когда конструктор копирования генерируется компилятором, он вызывает конструктор копирования базового класса.
Конструкторы, определенные компилятором, не являются специальными, их можно вызывать явно:
class Base {
int num_
public:
Base(int n) : num_(n) { }
// copy constructor defined by compiler
};
class Derived : public Base {
float flt_;
public:
Derived(float f, int n) : Base(n), flt_(f) { }
// Copy constructor
Derived(const Derived& other)
: Base(other) // OK to explicitly call compiler generated copy constructor
, flt_(other.flt_)
{
}
};
Подробнее см. В этой статье Википедии .