Рассмотрим этот код С++:
#include <iostream>
using namespace std;
struct B {
virtual int f() { return 1; }
int g() { return 2; }
};
struct D1 : public B { // (*)
int g() { return 3; }
};
struct D2 : public B { // (*)
virtual int f() { return 4; }
};
struct M : public D1, public D2 {
int g() { return 5; }
};
int main() {
M m;
D1* d1 = &m;
cout << d1->f()
<< static_cast<D2&>(m).g()
<< static_cast<B*>(d1)->g()
<< m.g();
}
Он печатает 1225
. Если мы сделаем виртуальное наследование, т.е. Добавим virtual
до public
в строки, помеченные знаком (*), он печатает 4225
.
- Можете ли вы объяснить, почему
1
изменяется на4
? - Можете ли вы объяснить значение
static_cast<D2&>(m)
иstatic_cast<B*>(d1)
? - Как вы не теряетесь в таких комбинациях? Вы что-то рисуете?
- Общеизвестно ли распространять такие сложные настройки в обычных проектах?