【发布时间】:2020-09-29 08:35:05
【问题描述】:
我们有一个子类practicante,它继承自两个类:estudiante 和empleado,它们都继承自祖父类persona。它们都有 que_eres() 方法,它写出对象是什么类(仅作为示例):
#include <iostream>
using namespace std;
class persona
{
public:
void que_eres() { cout<<"Soy una persona."<<endl; }
};
class estudiante: public persona
{
public:
void que_eres()
{
cout<<"Soy un estudiante."<<endl;
persona::que_eres();
}
};
class empleado: public persona
{
public:
void que_eres()
{
cout<<"Soy un empleado."<<endl;
persona::que_eres();
}
};
class practicante: public estudiante, public empleado
{
public:
void que_eres()
{
estudiante::que_eres();
empleado::que_eres();
}
};
int main()
{
practicante jose;
jose.que_eres();
}
结果是:
Soy un estudiante.
Soy una persona.
Soy un empleado.
Soy una persona.
还不错,不过如果Soy una persona只写一次会更好(即祖父的方法que_eres()只执行一次)。这可能吗?
例如,在 Python 中我们可以这样做:
class persona:
def que_eres(self):
print("Soy una persona.")
class estudiante(persona):
def que_eres(self):
print("Soy un estudiante.")
super().que_eres()
class empleado(persona):
def que_eres(self):
print("Soy un empleado.")
super().que_eres()
class practicante(estudiante,empleado):
def que_eres(self):
super().que_eres()
jose = practicante()
jose.que_eres()
结果就是:
Soy un estudiante.
Soy un empleado.
Soy una persona.
【问题讨论】:
-
这是一个很好的例子,说明了为什么多重继承通常不是一个好主意。
-
请注意,您的
practicante不是 apersona,但实际上是 两个personas。一个是estudiante,一个是empleado。
标签: c++ inheritance multiple-inheritance class-design diamond-problem