Рассмотрим следующий пример:
struct B1 {
void f() {
this->g();
std::cout << this << std::endl;
}
void g() {
std::cout << "B1::g" << std::endl;
}
};
struct B2 {
void f() {
this->g();
std::cout << this << std::endl;
}
void g() {
std::cout << "B2::g" << std::endl;
}
};
struct C: B1, B2 {
void f() {
B1::f();
B2::f();
std::cout << this << std::endl;
}
void g() {
std::cout << "C::g" << std::endl;
}
};
int main() {
C c;
c.f();
return 0;
}
Для меня вывод:
B1::g
0x7fffa11436b7
B2::g
0x7fffa11436b7
0x7fffa11436b7
Давайте сосредоточимся на B2::f
, Как видно из вывода, внутри B2::f
, this
указывает на начало объекта типа C
, Итак, как это this->g()
решено правильно, чтобы B2::g()
?
Здесь нет никаких виртуальных функций. Так ты звонишь g
функция-член от B1::f
ты звонишь по определению B1::g
, Вещи действительно пошли бы по-другому, если g
был виртуальным, потому что тогда все f
функции будут вызывать C::g
(просто попробуйте заменить void g()
с virtual void g()
всего 3 структуры)
Других решений пока нет …