面试题答案
一键面试以下以Python语言为例:
Python本身并不支持传统意义上的多重继承(因为会导致菱形继承问题),但可以通过mixin
类和super()
函数来实现类似功能。
class A:
def method1(self):
raise NotImplementedError
class B(A):
def method1(self):
print("B's method1")
class C(A):
def method1(self):
print("C's method1")
class D(B, C):
def method1(self):
B.method1(self)
C.method1(self)
解释:
- 首先定义了抽象类
A
,其中包含抽象方法method1
。 B
和C
类继承自A
并分别实现了method1
。D
类继承自B
和C
。在D
类的method1
方法中,直接通过类名调用B
和C
的method1
方法,并将self
作为参数传入,这样就可以调用到不同父类的method1
实现。
如果使用super()
函数,可能会出现意外结果,因为Python的super()
是按照mro
(方法解析顺序)来查找方法的,在这种菱形继承结构下,使用super()
可能达不到分别调用B
和C
的method1
的目的。
在C++语言中:
#include <iostream>
class A {
public:
virtual void method1() = 0;
};
class B : public A {
public:
void method1() override {
std::cout << "B's method1" << std::endl;
}
};
class C : public A {
public:
void method1() override {
std::cout << "C's method1" << std::endl;
}
};
class D : public B, public C {
public:
void method1() {
B::method1();
C::method1();
}
};
解释:
- 定义抽象类
A
,包含纯虚函数method1
。 B
和C
类继承自A
并实现method1
。D
类多重继承自B
和C
。在D
类的method1
方法中,通过类名::方法名
的形式分别调用B
和C
的method1
方法,从而实现对不同父类method1
实现的调用。
在Java中,Java不支持多重继承,但可以通过接口来模拟类似功能:
interface A {
void method1();
}
class B implements A {
@Override
public void method1() {
System.out.println("B's method1");
}
}
class C implements A {
@Override
public void method1() {
System.out.println("C's method1");
}
}
class D implements A {
private B b = new B();
private C c = new C();
@Override
public void method1() {
b.method1();
c.method1();
}
}
解释:
- 定义接口
A
,包含抽象方法method1
。 B
和C
类实现接口A
的method1
方法。D
类实现接口A
,通过组合的方式(在D
类中创建B
和C
的实例),在D
类的method1
方法中调用B
和C
实例的method1
方法,达到类似多重继承处理不同实现的效果。