Возможно, вам нужно добавить предварительное объявление, поскольку производный класс еще не объявлен при объявлении базового класса.
class extPersonType;
Но это не обязательно. Почему бы вам не объявить ваши базовые конструкторы по обычному шаблону? Это принимает аргумент того же типа, что и класс. Это прекрасно работает и не зависит от производного класса.
personType(const PersonType &obj)
: firstname(obj.firstname)
, lastname(obj.lastname)
{
}
Кстати, это более эффективно и показывает, что вы знаете C ++, когда используете список инициализаторов. Это позволит избежать вызова конструктора по умолчанию и последующего вызова оператора присваивания.
https://en.cppreference.com/w/cpp/language/initializer_list
Тем не менее, использование деривации для объединения несвязанных объектов все еще является плохим проектом Адрес не соответствует отношениям IS-A с человеком. Так что не имеет смысла иметь extPersonType
производное от addressType
.
Вместо этого вы должны использовать сдерживание, когда у вашего extPersonType
класса будет addressType
член.
class extPersonType : public personType
{
addressType address;
dataType birth_date;
};
Единственная причина, по которой можно получить 3 класса одновременно, - это лень . Несколько секунд, которые вы сначала сэкономите, сделают ваш код труднее поддерживать по мере роста вашего класса. И в какой-то момент вам может потребоваться поддержка более одного адреса или даты, например, даты приема на работу, если в этом случае вам придется внести гораздо больше изменений в код, так как переменная станет использоваться во многих местах. Вы будете тратить впустую все время, которое вы изначально сэкономили, и многое другое.
Кстати, это плохая идея, чтобы неправильно писать слова в вашем коде. Правильное написание - дата , а не данные , учитывая, что мы легко видим, что это дата от членов, а не произвольные данные.
Кстати, неплохо было бы почитать хорошие книги по дизайну и кодированию , так как это очень простой материал, который должен освоить каждый программист.