![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| victor79 |
|
|||
|
программист ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 15.5.2008 Репутация: нет Всего: нет |
можно ли какими либо способами вызвать виртуальный метод предка? Даже если не стандартными и не корректными для MinGW?
Пусть будет виртуальный метод virtual void do_somethig(), который что то проверяет, и в случае если что-то не проверилось, нужно вызвать реализацию, которая была у предка. Если будет указатель на vtable предка, то можно сформировать временный пусть и кривой указатель и вызвать от него. Сама виртуальная функция свойств класса не использует, и потому ошибок не будет. Стандартными средствами, на сколько я знаю, такого не возможно. Потому вопрос, как узнать указатель на vtable предка? (для текущего объекта он вроде определяется как *(void**)p_obj) |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
вы о этом?
Это сообщение отредактировал(а) SenkraD - 31.7.2013, 16:55 |
|||
|
||||
| victor79 |
|
|||
|
программист ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 15.5.2008 Репутация: нет Всего: нет |
не, здесь как раз то указывается предок base::foo(), а вот так что бы без base:: - стандартных средств вроде нету. Потому и спрашиваю, какие есть не стандартные, или как добраться до родительской vtable. указание base:: это дублирование того, что уже указано в объявлении класа, а я хочу вызвать без дублирования - у меня куча объектов, которые наследуются от t_object в несколько этажей. И вызов запихнут в макрос, типа REGTYPE(TYPE,PARENT), который я прописываю в каждый наследуемый класс, в котором переопределяются виртуальные функции. И я хочу попробовать избавиться от необходимости указывать PARENT. |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А в классе base создать public member - указатель на функцию никак?
И обращаться к нему в дочерних классах? -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
я думаю, что у человека нет доступа к класу base, ибо если есть то можно:
а если доступа к исходникам класса нет, то читать доки на компилер и делать хаки через гуляние по vtable. |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Да и не вижу я здесь поблемы. Точнее, не знаю.
Всегда же можно и указатель на дочерний класс просто привести к указателю на базовый. Очень вопрос непонятен "не зная типа". Сигнатуру функции в дочернем классе он видит, там всё просто. Если только он не знает, какой вообще первый базовый класс.. но там в инклюдах всё разыскивается. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| SenkraD |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
ну я сам не вижу проблеммы в указании имени предка, когда нужен явный вызов так, как ты должен осознавать что делаешь и скрывать это за макросами не лушчая идея.
|
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |