StudentEmployee
определенно является подклассом Person
.Проблема в том, что он дважды : он косвенно наследует Person
дважды (один раз через Student
и один раз через Employee
), и поэтому вы получаете ошибку "неоднозначный базовый класс".Чтобы убедиться, что StudentEmployee
наследует только Person
один раз, вы должны использовать виртуальное наследование , например:
class Person {};
class Student : public virtual Person {};
class Employee : public virtual Person {};
class StudentEmployee : public Student, public Employee {};
Это исправит вашу ошибку.
Однако есть еще одна большая проблема с вашим кодом, и она называется нарезка .
Когда вы делаете это:
Person ppl[3] = {pat, sam, em};
Массивиз трех Person
объектов будут созданы, но эти объекты будут созданы с использованием неявно определенного конструктора копирования класса Person
.Теперь проблема в том, что объекты в вашем массиве будут просто Person
объектами, а не объектами подклассов, которые вы хотите, чтобы они были.
Чтобы это исправить, вам придется создать массивуказателей на Person
объектов, например:
Person* ppl[] = {new Person("Pat"), new Student("Sam"),
new Employee("Emily"), new StudentEmployee("Sienna")};
или
Person* ppl[] = {&pat, &sam, &em, &sen};