Форум: "Начинающим";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
ВнизНаследование: вызов метода потомка через родителя Найти похожие ветки
← →
Rembo (2010-08-22 00:37) [0]Всем привет!
У меня есть класс родитель и несколько потомков.
Можно ли не зная типа потомка вызвать его метод через родителя?
Пример:
TParrentClass(Pointer).proc;
Где Pointer содержит указатель на экземпляр потомка TParrentClass
← →
sniknik © (2010-08-22 00:44) [1]к чему извраты? обычная виртуальная процедура, описанная и вызванная в предке вызывает реализацию потомка... все стандартно, прозрачно, без всяких ухищрений.
← →
Юрий Зотов © (2010-08-22 00:46) [2]Если метод Proc - виртуальный (или динамический), то без проблем.
← →
Rembo (2010-08-22 00:47) [3]Суть такова: есть tlist с указателями на несколько потомков, у каждого по своему реализована proc. Хочу в цикле пройтись и у каждого ее вызвать
TParrentClass(objects[i]).proc;
вызывает ошибку
← →
Rembo (2010-08-22 00:49) [4]2Юрий Зотов
TParrentClass=class
procedure proc; virtual;Abstract;
end;
TChild=class(TParrentClass)
procedure proc;override;
end;
← →
Rembo (2010-08-22 00:54) [5]Ага я понял уже все, пасиба
← →
Юрий Зотов © (2010-08-22 20:59) [6]
> Rembo (22.08.10 00:54) [5]
Фишка в том, что первые 4 байта по адресу, на который указывает Ваш Pointer, содержат адрес VMT (таблицы виртуальных методов, которая уже содержит адреса самих методов). Когда Вы создавали объект, то в эти его первые 4 байта записался адрес VMT того класса, к которому созданный объект фактически принадлежит. Поэтому и будет вызван правильный нужный метод, а приведение указателя к TParentClass нужно лишь затем, чтобы не ругался компилятор.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c