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是基类,其直接由两个子类Student和Employee.StudentEmployee使用多重继承来子类化Student和Employee.
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)