多型

Prerequisites:

Python的多型,在成員變數的部分,跟C++與Java不一樣。

C++ 多型

Parent與Child都有相同成員變數name,但子類別沒有覆寫Parent的hi()函式,執行結果為Parent的name。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include "main.h"
using namespace std;
class Parent {
 public:
  string name = "Parent";
  virtual void hi() {
    cout << "name = " << this->name << endl;
  }
};
class Child:public Parent {
 public:
  string name = "Child";
};
int main() {
  Parent* ptr = new Child;
  ptr->hi();
  return 0;
}
Parent

Java 多型

Parent與Child都有相同成員變數name,但子類別沒有覆寫Parent的hi()函式,執行結果為Parent的name。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
  public static void main(String[] args) {
    Parent obj = new Child();
    obj.hi();
  }
}
class Parent {
  String name = "Parent";
  public void hi() {
    System.out.println("name = " + this.name);
  }
}
class Child extends Parent{
  String name = "Child";
}
name = Parent

Python 多型

Parent與Child都有相同成員變數name,但子類別沒有覆寫Parent的hi()函式,執行結果為Child的name。

1
2
3
4
5
6
7
8
9
10
11
class Parent:
    name = "Father"

    def hi(self):
        print("name =", self.name)

class Child(Parent):
    name = "Child"

obj = Child()
obj.hi()
name = Child

Python vs Java vs C++

Python在讀取 self.name 成員變數,先從子類別Child找,有這個屬性就取得。
如果子類別沒有name屬性,就去父類別找,如果仍找不到就去祖父類別找,直到找到為止。

Java 與 C++:
執行誰的方法,就是使用誰的成員變數。
執行父類別的方法,使用父類別的成員變數。
執行子類別的方法,使用子類別的成員變數。

因為Child類別沒有hi()方法,就會去執行父類別的hi()方法,就會使用父類別的name成員變數。

results matching ""

    No results matching ""