Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多重继承方法解析:C++;vs Python 我看到C++和Python如何处理菱形继承场景,行为非常不同。p>_Python_C++_Multiple Inheritance - Fatal编程技术网

多重继承方法解析:C++;vs Python 我看到C++和Python如何处理菱形继承场景,行为非常不同。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

对于以下两个代码段,逻辑相同,但输出不同。我不明白为什么。如果有人能提供一些见解,我将不胜感激

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打印出
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
shadows
C.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):
     ...