在python中如何在C++中执行以下操作?
B* b = new D();
b->virtual_fn();
哪个会在 D 中调用 virtual_fn。是否有一种引用形式可以做到这一点?
最佳答案
在 Python 中,值具有类型而不是变量。后者只是它们当前绑定(bind)到的值的有用名称。由于变量没有类型,如果您创建一个 D
对象并将变量绑定(bind)到它,那么您将获得 D
类显式定义的方法和 B
没有被替换的类。实际上,一切都是虚拟的。
现在如果你想在B
中调用一个在D
中被替换的方法,你必须调用该方法并传递self
明确地。这是一个为保护无辜者而篡改 id()
的示例。
>>> class B(object):
... def virtual_fn(self):
... print 'in B.virtual_fn() for', id(self)
... def other_virtual_fn(self):
... print 'in B.other_virtual_fn() for', id(self)
... def call_virtual(self):
... print 'in B.call_virtual() for', id(self)
...
>>> class D(B):
... def virtual_fn(self):
... print 'in D.virtual_fn() for', id(self)
...
>>> b_obj = B()
>>> d_obj = D()
>>> id(b_obj)
1
>>> id(d_obj)
2
>>>
>>> b_obj.virtual_fn()
in B.virtual_fn() for 1
>>> d_obj.virtual_fn()
in D.virtual_fn() for 2
>>> d_obj.other_virtual_fn()
in B.other_virtual_fn() for 2
>>>
>>> B.virtual_fn(d_obj)
in B.virtual_fn() for 2
>>>
>>> d_obj.call_virtual()
in B.call_virtual() for 2
in D.virtual_fn() for 2
>>>
请记住,d_obj.virtual_fn()
本质上是D.virtual_fn(d_obj)
的语法糖。因此,如果您想显式调用基类的隐藏方法,则无需糖 - B.virtual_fn(d_obj)
。我强烈建议阅读 Method Resolution Order (mro)来自 Python 2.3 的文档。它确实解释了所有这一切是如何运作得很好的。
编辑
再次阅读问题后,我添加了 call_virtual
内容,因为我很确定这是您感兴趣的内容。
关于python - 如何表达调用派生虚拟的基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1907182/