Я вижу совсем другое поведение в том, как C++ и Python обрабатывают сценарий наследования алмазов.Решение множественного разрешения наследования: C++ vs Python
Для следующих двух фрагментов кода логика такая же, но выход отличается. Я не понимаю, почему. Я был бы очень признателен, если бы кто-то мог дать некоторое представление.
Python печатает "BB"
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++ печатает "BC"
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();
}
Когда я добавить строку cout << typeid(*this).name() << endl;
к каждому bar()
описанным выше способом в C++, это то, что печатается :
B 0x7fff803d9b70
C 0x7fff803d9b78
D 0x7fff803d9b70
Похоже, что B
и D
поделились тем же адресом, но C
находится в другой таблице vtable.
Редактировать
Как указывается в ответе @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
Кажется, что и B.foo
и D.foo
- один и тот же метод по значению как в python 2, так и 3, но python 2 делает копию, а python 3 - нет.
Если вы хотите питона, как наследование в C++, вам нужно использовать виртуальное наследование. – o11c
Этот C++ не настоящий алмаз: 'D' имеет 2 разных унаследованных' A' баз. – rodrigo
@ o11c: Я действительно хочу наоборот: поведение на C++ является предпочтительным. –