gpt4 book ai didi

C++ : Multiple inheritance with polymorphism

转载 作者:IT老高 更新时间:2023-10-28 22:59:03 25 4
gpt4 key购买 nike

(请原谅菜鸟问题)

我有 4 节课:

class Person {};
class Student : public Person {};
class Employee : public Person {};
class StudentEmployee : public Student, public Employee {};

基本上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};

当我使用基类 Person 的数组时,我可以将 Person 及其所有子类放入该数组中。除了StudentEmployee,给出的原因是基类不明确。

鉴于 StudentEmployee 保证具有 Person 的所有方法和属性,那么 StudentEmployee 是否被视为 Person 的子类?

  • 如果是这样,为什么编译器不允许我将对象分配给其父类(super class)类型的变量?
  • 如果没有,为什么不呢?以及实现此目的的正确方法是什么?

干杯


编辑:先发制人,这个问题与以下任何一个都不相同:
polymorphism relates inheritance
Inheritance mucking up polymorphism in C++?

最佳答案

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 {};

这将解决您的错误。

不过,您的代码还有另一个大问题,它被称为 slicing .

当你这样做时:

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};

关于C++ : Multiple inheritance with polymorphism,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com