多态 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
,如果 self
是 Derived
类型。 C++ 中的成员访问是静态的,并根据静态类型进行解析。 this->x
在 Base
的成员函数中总是会找到 Base::x
.
我很好奇 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
,如果 self
是 Derived
类型。 C++ 中的成员访问是静态的,并根据静态类型进行解析。 this->x
在 Base
的成员函数中总是会找到 Base::x
.