我看到 C++ 和 Python 在处理菱形继承场景时表现非常不同。
对于以下两个代码片段,逻辑相同但输出不同。我不明白为什么。如果有人能提供一些见解,我将不胜感激。
Python 输出“B B”。
但是C++会输出 "B C"。
当我在C++中的每个
对于以下两个代码片段,逻辑相同但输出不同。我不明白为什么。如果有人能提供一些见解,我将不胜感激。
Python 输出“B B”。
class A(object):
def foo(self):
print 'A'
class B(A):
def foo(self):
print 'B'
def bar(self):
self.foo()
class C(A):
def foo(self):
print 'C'
def bar(self):
self.foo()
class D(B, C):
def bar(self):
B.bar(self)
C.bar(self)
D().bar()
但是C++会输出 "B C"。
struct A
{
virtual void foo() {
cout << "A" << endl;
}
};
struct B : public A
{
virtual void foo() {
cout << "B" << endl;
}
virtual void bar() { this->foo(); }
};
struct C : public A
{
virtual void foo() {
cout << "C" << endl;
}
virtual void bar() { this->foo(); }
};
struct D : public B, public C
{
virtual void bar() {
B::bar();
C::bar();
}
};
int main()
{
D().bar();
}
当我在C++中的每个
bar()
方法中添加cout << typeid(*this).name() << endl;
这一行时,将会打印出以下内容:B 0x7fff803d9b70
C 0x7fff803d9b78
D 0x7fff803d9b70
看起来B
和D
共享同一地址,但C
在另一个虚表中。
编辑
如回复@JoranBeasley所建议的,我尝试对Python代码进行以下检查:
D.foo == B.foo
D.foo == C.foo
D.foo is B.foo
D.foo is C.foo
Python 2.7 输出 True False False False
Python 3.4 输出 True False True False
看起来在 Python 2 和 3 中,B.foo
和 D.foo
都是相同的方法,但是 Python 2 会复制,而 Python 3 则不会。
D
有两个不同继承的A
基类。 - rodrigo