C++:具有多态性的多重继承

bgu*_*uiz 13 c++ polymorphism multiple-inheritance hierarchy

(事先原谅noob问题)

我有4个班:

class Person {};
class Student : public Person {};
class Employee : public Person {};
class StudentEmployee : public Student, public Employee {};
Run Code Online (Sandbox Code Playgroud)

基本上Person是基类,其直接由两个子类StudentEmployee.StudentEmployee使用多重继承来子类化StudentEmployee.

Person pat = Person("Pat");
Student sam = Student("Sam");
Employee em = Employee("Emily");
StudentEmployee sen = StudentEmployee("Sienna");


Person ppl[3] = {pat, sam, em};
//compile time error: ambiguous base class
//Person ppl[4] = {pat, sam, em, sen}; 
Run Code Online (Sandbox Code Playgroud)

当我使用Person基类的数组时,我可以将Person它的所有子类放在这个数组中.除了StudentEmployee,给出基础模糊的原因.

鉴于StudentEmployee保证拥有所有方法和属性Person,被StudentEmployee认为是Person的子类?

  • 如果是这样,为什么编译器不允许我将对象分配给其超类类型的变量?
  • 如果没有,为什么不呢; 什么是实现这一目标的正确方法?

干杯


编辑:先发制人,这个问题与以下任何一个问题都不一样:
多态性与继承有关继承
在C++中破坏多态性?

Job*_*Job 14

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 {};
Run Code Online (Sandbox Code Playgroud)

这将解决您的错误.

但是,您的代码还有另一个大问题,那就是切片.

当你这样做:

Person ppl[3] = {pat, sam, em};
Run Code Online (Sandbox Code Playgroud)

Person将创建一个包含三个对象的数组,但这些对象将使用类的隐式定义的复制构造函数进行复制Person.现在,问题在于数组中的对象只是Person对象而不是您希望它们的子类的对象.

要解决这个问题,你必须创建一个指向Person对象的指针数组,如下所示:

Person* ppl[] = {new Person("Pat"), new Student("Sam"),
                 new Employee("Emily"), new StudentEmployee("Sienna")};
Run Code Online (Sandbox Code Playgroud)

要么

Person* ppl[] = {&pat, &sam, &em, &sen};
Run Code Online (Sandbox Code Playgroud)