Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вызвать виртуальный метод предка, не зная типа 
:(
    Опции темы
victor79
Дата 31.7.2013, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



можно ли какими либо способами вызвать виртуальный метод предка? Даже если не стандартными и не корректными для MinGW?

Пусть будет виртуальный метод virtual void do_somethig(), который что то проверяет, и в случае если что-то не проверилось, нужно вызвать реализацию, которая была у предка. Если будет указатель на vtable предка, то можно сформировать временный пусть и кривой указатель и вызвать от него. Сама виртуальная функция свойств класса не использует, и потому ошибок не будет.

Стандартными средствами, на сколько я знаю, такого не возможно. Потому вопрос, как узнать указатель на vtable предка?
(для текущего объекта он вроде определяется как *(void**)p_obj)
PM MAIL WWW   Вверх
SenkraD
Дата 31.7.2013, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



вы о этом?
Код
#include <cstddef>
#include <iostream>

static inline bool willPigsFly()
{
    return false;
}

struct base
{
    virtual void foo(void) const
    {
        std::cout << __FUNCTION__ << std::endl;
    }
};

struct child : base
{
    virtual void foo(void) const
    {
        if (willPigsFly())
        {
            base::foo();
        }
        std::cout << __FUNCTION__ << std::endl;
    }
};

struct child_ex : child
{
    virtual void foo(void) const
    {
        if (willPigsFly())
        {
            base::foo();
        }
        std::cout << __FUNCTION__ << std::endl;
    }
};

int main(int argc, char* argv[])
{
    child_ex object;

    object.foo();
    object.base::foo();
    
    std::system("pause");
    return 0;
}


Это сообщение отредактировал(а) SenkraD - 31.7.2013, 16:55


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
victor79
Дата 31.7.2013, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



Цитата(SenkraD @  31.7.2013,  16:49 Найти цитируемый пост)
вы о этом?

не, здесь как раз то указывается предок base::foo(), а вот так что бы без base:: - стандартных средств вроде нету. Потому и спрашиваю, какие есть не стандартные, или как добраться до родительской vtable.

указание base:: это дублирование того, что уже указано в объявлении класа, а я хочу вызвать без дублирования - у меня куча объектов, которые наследуются от t_object в несколько этажей. И вызов запихнут в макрос, типа REGTYPE(TYPE,PARENT), который я прописываю в каждый наследуемый класс, в котором переопределяются виртуальные функции. И я хочу попробовать избавиться от необходимости указывать PARENT.
PM MAIL WWW   Вверх
akizelokro
Дата 1.8.2013, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



А в классе base создать public  member - указатель на функцию никак?
И обращаться к нему в дочерних классах?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
SenkraD
Дата 1.8.2013, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



я думаю, что у человека нет доступа к класу base, ибо если есть то можно:
  • сделать указатель на функцию
  • использовать тот или иной вид функтора
а уже как это лучше использовать (макросы, шаблоны и т.д. и т.п.)  можно будет придумать

а если доступа к исходникам класса нет, то читать доки на компилер и делать хаки через гуляние по vtable.




--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
akizelokro
Дата 1.8.2013, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Да и не вижу я здесь поблемы. Точнее, не знаю.
Всегда же можно и указатель на дочерний класс просто привести к указателю на базовый.

Очень вопрос непонятен "не зная типа". Сигнатуру функции в дочернем классе он видит, там всё просто. Если только он не знает, какой вообще первый базовый класс.. но там в инклюдах всё разыскивается.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
SenkraD
Дата 1.8.2013, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



ну я сам не вижу проблеммы в указании имени предка, когда нужен явный вызов так, как ты должен осознавать что делаешь и скрывать это за макросами не лушчая идея.

Цитата(akizelokro @  1.8.2013,  13:18 Найти цитируемый пост)
Всегда же можно и указатель на дочерний класс просто привести к указателю на базовый.
не подойдёт же; функция - виртуальная, потому через таблицу вызов будет идти, а не по привязке к типу

Цитата
И я хочу попробовать избавиться от необходимости указывать PARENT.
Код
typedef base parent_class;
и делать дальше вызовы через него. я думаю что раз вы пихаете кучу макросов для переопеределения методов, то добавить еще один, который слепит typedef не сложно. Еще у VS было розширение в виде ключевого слова __super, которое можно было использовать в теле методов класса, так что можно поискать что-то такое и для вашего компилера


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.