Здравствуйте, Eldar9x, Вы писали:
E>На самом деле, хотелось узнать, можно ли как то управлять вызовами виртуальных функций.
Можно. Есть 2 варианта:
1.неквалифицированный вызов a->do_it() — вызывается final overrider, т.е. в данном случае C::do_it.
2.квалифицированный вызов — вызывается указанный вариант:
B* b = new C();
b->A::do_it();
b->B::do_it()
E>То есть получается, что уже в момент создания объекта по указателю на базовый класс,
E>E>A *a = new C();
E>
"создание объекта по указателю на базовый класс" — бесмыссленая фраза.
E>мы определяем, какая функция будет вызываться для этого объекта в иерархии классов.
Именно — объект имеет свой динамический тип, который невозможно изменить.
E>А если вдруг окажется, что мне в какой-то момент понадобился вызов виртуальной функции не подразумевающегося класса, а скажем на шаг выше, или даже на два. Отсюда и возникает вопрос, возможно ли каким-то образом манипулировать указателем, уже после того, как объект создан, и тип его уже известен.
Указателем манипулировать можно, но динамический тип объекта от этого не изменится.
E>То есть, a->do_it() точно известно, что вызовется витуальная функция текущего типа класса.
E>Как вызвать для ЭТОГО объекта виртуальную функцию ОПРЕДЕЛЕННОГО класса, причем не меняя при этом никаких данных объекта, не меняя его тип итп?
Используя явную квалификацию. Если, имея указатель типа A*, и зная, что этот указатель указывает на объект типа C, то для вызова метода B::do_it нужно проделать 2 операции:
1. преобразовать указатель типа A* в указатель типа B* или C*
2. вызвать требуемый метод, используя явную квалификацию
A* a = new C();
B* b = static_casz<B*>(a);
b->B::do_it();
C* c = static_cast<C*>(a);
c->B::do_it();
c->C::do_it();