Как определяется функция-член на основе этого указателя производного класса?

Рассмотрим следующий пример:

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()?

2

Решение

Здесь нет никаких виртуальных функций. Так ты звонишь g функция-член от B1::f ты звонишь по определению B1::g, Вещи действительно пошли бы по-другому, если g был виртуальным, потому что тогда все f функции будут вызывать C::g (просто попробуйте заменить void g() с virtual void g() всего 3 структуры)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]