多重继承方法解析:C++;vs Python 我看到C++和Python如何处理菱形继承场景,行为非常不同。p>
对于以下两个代码段,逻辑相同,但输出不同。我不明白为什么。如果有人能提供一些见解,我将不胜感激 Python打印出“B” <>但C++打印出“B C”< /P> 似乎多重继承方法解析:C++;vs Python 我看到C++和Python如何处理菱形继承场景,行为非常不同。p>,python,c++,multiple-inheritance,Python,C++,Multiple Inheritance,对于以下两个代码段,逻辑相同,但输出不同。我不明白为什么。如果有人能提供一些见解,我将不胜感激 Python打印出“B” 但C++打印出“B C”< /P> 似乎B和D共享相同的地址,但C位于不同的vtable中 编辑 正如回复@JoranBeasley中所建议的,我尝试了以下python代码检查: D.foo == B.foo D.foo == C.foo D.foo is B.foo D.foo is C.foo Python2.7打印出True-False Python 3.4打印出Tr
B
和D
共享相同的地址,但C
位于不同的vtable中
编辑
正如回复@JoranBeasley中所建议的,我尝试了以下python代码检查:
D.foo == B.foo
D.foo == C.foo
D.foo is B.foo
D.foo is C.foo
Python2.7打印出True-False
Python 3.4打印出True-False
在Python2和Python3中,
B.foo
和D.foo
似乎在值上是相同的方法,但是Python2复制了一个副本,而Python3没有 我只能解释python中的一些内容
C.bar(self)
将在中创建的D的实例作为self
因此,当它调用self.foo()
时,与您在D.bar
内部说self.foo()
没有什么不同(即self
保持静态不变)
因为继承是从右到左B.foo
shadowsC.foo
D.foo is B.foo # should print True
D.foo is C.foo # should print false
你可以随时打电话
C.foo(self) #prints C as expected
这实际上与Python多重继承方法的解析顺序无关,因为这是通过super()
调用处理的。。。相反,您尝试显式地调用父类方法,而不是允许python隐式地为您解析它们
至于为什么不同于C++,则是因为它是两种不同的语言,它们以不同的方式实现继承和多重继承……< 如评论中所述,您可以将D的定义更改为
class D(C,B):
...
然后
D().foo()
将打印C
还提到,如果他将继承顺序(D类(B,C):
)更改为(D类(C,B):
),它将打印C
)(在您解释了从右到左的继承之后)谢谢您的回答。但是这两行都打印出False
@JimJarvis您能提到Python版本吗?@JimJarvis啊哈。这就是原因。Joran的答案是在Python3中。我确信这是关于在Python3中为object
继承的东西,它是automagic。。。在Python 2中,必须说明在C++中需要Python的继承,需要使用虚拟继承。这个C++不是真正的菱形:<代码> d>代码>有2个不同的继承<代码> A<代码> > Base.O11:我实际上想换个角度:C++行为是首选。这是个好问题。你可以从这个@BhargavRao网站上读到几点,这是一篇非常好的帖子。谢谢!
D.foo is B.foo # should print True
D.foo is C.foo # should print false
C.foo(self) #prints C as expected
class D(C,B):
...