简述继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? ?
参考答案:
在面向对象编程中,当我们讨论继承时,类的执行顺序通常涉及到构造函数、析构函数、以及方法的调用。特别是在涉及到多重继承时,执行顺序可能会变得复杂。
以下是几个常见的与继承有关的执行顺序问题:
-
构造函数和析构函数的执行顺序:
- 构造函数:当创建一个类的对象时,首先会调用基类(最顶层的父类)的构造函数,然后按照继承层次结构向上调用每个中间类的构造函数,最后调用最派生类(最底层的子类)的构造函数。这就是所谓的构造函数调用顺序——从基类到派生类。
- 析构函数:当对象被销毁时,析构函数的调用顺序与构造函数相反。首先调用最派生类的析构函数,然后依次向上调用每个中间类的析构函数,最后调用基类的析构函数。这就是所谓的析构函数调用顺序——从派生类到基类。
-
方法的覆盖和调用:
- 如果一个方法在派生类中被覆盖(重写),那么当通过这个派生类对象调用该方法时,会调用派生类中的实现,而不是基类中的实现。这被称为动态绑定或运行时绑定。
- 如果在派生类中调用基类中被覆盖的方法,可以使用
super
关键字(在某些语言中如Java)或直接使用基类名(在某些语言中如C++),来显式地调用基类中的方法。
选择题示例:
class Base:
def __init__(self):
print("Base init")
class Derived(Base):
def __init__(self):
print("Derived init")
super().__init__()
d = Derived()
问题:以上代码将打印什么?
答案:
Derived init
Base init
解释:首先,当创建Derived
类的对象d
时,首先调用Derived
类的构造函数,打印出"Derived init"。然后,在Derived
类的构造函数中,通过super().__init__()
调用基类Base
的构造函数,打印出"Base init"。