多态 Python 字段查找与 C++ 字段查找

Polymorphic Python field lookup vs C++ field lookup

我很好奇 Python 和 C++ 查找字段如何使用继承的 getter 之间的差异。考虑这两个代码片段及其输出。


class Base: 
    x = 10
    def get_x(self):
        return self.x

class Derived(Base):
    x = 20

print(Base().get_x())
print(Derived().get_x())

产出

10
20

另一方面,考虑以下 C++,

class Base{
    public:
    int x = 10 ; 
    
    virtual int get_x(){
     return this->x;    
    }
};

class Derived : public Base{
    public:
    int x = 20;
    
}; 

void main(){

cout << Base().get_x() << endl; 
cout << Derived().get_x() << endl; 

};

产出

10
10

为什么这两个代码片段有不同的输出?这些导致输出差异的代码片段中发生了什么内部工作?感谢您的帮助!

它们有不同的输出,因为 C++ 和 Python 是两种根本不同的语言,并且它们以根本不同的方式工作。

C++ 版本在逻辑上不等同于 Python 版本。 C++ 版本有两个完全不同的 class 成员,名为 x,属于两个不同的 classes。声明一个与其 superclass 的成员同名的 class 成员只是声明另一个 class 成员,与 superclass。的确,一个是另一个的subclass,但这没有区别。 getter 只知道其中一个,因此设置另一个 class 同名成员无效。

C++和Python中,有两个class成员,一个在Base中,一个在Derived中.

可观察到的根本区别在于 Python 中的成员访问实际上是虚拟的。 self.x 将首先找到 Derived.x,如果 selfDerived 类型。 C++ 中的成员访问是静态的,并根据静态类型进行解析。 this->xBase 的成员函数中总是会找到 Base::x.