Re[7]: Приведение типа указателя
От: Bell Россия  
Дата: 05.03.08 14:25
Оценка: 3 (1)
Здравствуйте, 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();
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.