跳到主要内容

简述继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么? ?

参考答案:

在面向对象编程中,当我们讨论继承时,类的执行顺序通常涉及到构造函数、析构函数、以及方法的调用。特别是在涉及到多重继承时,执行顺序可能会变得复杂。

以下是几个常见的与继承有关的执行顺序问题:

  1. 构造函数和析构函数的执行顺序

    • 构造函数:当创建一个类的对象时,首先会调用基类(最顶层的父类)的构造函数,然后按照继承层次结构向上调用每个中间类的构造函数,最后调用最派生类(最底层的子类)的构造函数。这就是所谓的构造函数调用顺序——从基类到派生类。
    • 析构函数:当对象被销毁时,析构函数的调用顺序与构造函数相反。首先调用最派生类的析构函数,然后依次向上调用每个中间类的析构函数,最后调用基类的析构函数。这就是所谓的析构函数调用顺序——从派生类到基类。
  2. 方法的覆盖和调用

    • 如果一个方法在派生类中被覆盖(重写),那么当通过这个派生类对象调用该方法时,会调用派生类中的实现,而不是基类中的实现。这被称为动态绑定或运行时绑定。
    • 如果在派生类中调用基类中被覆盖的方法,可以使用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"。