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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальная таблица 
V
    Опции темы
Graf_h
Дата 5.4.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

class A{
     virtual void func(){std::cout<<"function A"<<std::endl;

}

class B:public A{
     virtual void func(){std::cout<<"function B"<<std::endl;
}

void main(){
A *a=new B();
a->func();

}

В результате будет function B

Если  мы не обьявим функции виртуальными, то результат будет другой! По какому принцыпу работает виртуальная таблица в данном случае?

Это сообщение отредактировал(а) Graf_h - 5.4.2008, 09:43


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
JackYF
Дата 5.4.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Graf_h @  5.4.2008,  08:42 Найти цитируемый пост)
По какому принцыпу работает виртуальная таблица в данном случае?

Если ты имеешь в виду, как это вообще работает, то в учебниках можешь встретить описание.

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

А если virtual не ставить, то компилятор просто смотрит, что тип у объекта - A, и делает железную связку с A::func.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Graf_h
Дата 5.4.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можна ссылку? а то где не читал, то везде просто упоминается про виртуальную таблицу, а самого механизма не описано!


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
korian
Дата 5.4.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM   Вверх
bsa
Дата 5.4.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Graf_h
все просто, когда ты пишешь виртуальный метод:
Код
struct Base
{
   virtual void myFunc() const { std::cout << "Base\n"; }
};
struct Derived : public Base
{
    void myFunc() const { std::cout << "Derived\n"; }
};
То компилятор это превращает в нечто похожее на:
Код
struct Base {
   Base() { myFunc = &Base::__real_myFunc); }
   void (Base::*myFunc)() const;
private:
   void __real_myFunc() const { std::cout << "Base\n"; }
};
struct Derived : public Base
{
    Derived() : Base() { myFunc = &Derived::__real_myFunc; }
private:
    void __real_myFunc() const { std::cout << "Derived\n"; }
};
Поэтому когда ты вызываешь метод myFunc, вызывается метод самого последнего наследника, который его переопределяет.

На самом деле, все несколько сложней, но для понимания принципов достаточно, имхо.
PM   Вверх
Graf_h
Дата 7.4.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



korian,  классная стаття  smile !
bsa, 
Цитата(bsa @  5.4.2008,  22:02 Найти цитируемый пост)
На самом деле, все несколько сложней, но для понимания принципов достаточно, имхо.


Вот именно принципи я знаю, хочу узнать как на самом деле  smile !

Это сообщение отредактировал(а) Graf_h - 7.4.2008, 17:28


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
MAKCim
Дата 7.4.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Graf_h @  7.4.2008,  17:28 Найти цитируемый пост)
Вот именно принципи я знаю, хочу узнать как на самом деле

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Graf_h
Дата 8.4.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MAKCim @  7.4.2008,  19:03 Найти цитируемый пост)
так что компилятор в руки и смотреть ассемблерный листинг до просветления

C ассемблером знаком плохо, поэтому это мне не поможет  smile !



--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
archimed7592
Дата 8.4.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(Graf_h @  8.4.2008,  09:15 Найти цитируемый пост)
C ассемблером знаком плохо

Тогда не лезь в эти дебри - всему своё время smile.

Ну, либо, начни изучать ассемблер... Правда, знакомство с асмом может плохо повлиять, но... если юношеский максимализм прошёл, то можно смело начинать с Зубкова "Ассемблер для DOS, Windows, UNIX" smile.

Это сообщение отредактировал(а) archimed7592 - 8.4.2008, 09:30


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
mes
Дата 8.4.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Код

если  есть

class A
{
  void f1 ();
  virtual void f1_v();
};
class B : public A
{
    void f2 ();
    virtual void f2_v();
} * p;
 
тогда вызовы
1. p->f1();      
2. p->f2();
3. p->f1_v();
4. p->f2_v();

представляются у компилятора в условном виде

1 __call  __ f_table[__&а::f1] ()
2 __call  __f_table[__&b::f2] ()
3 __call  __v_table[typeid(p), __&a::f1_v] ()
4 __call  __v_table[typeid(p), __&b::f2_v] ()

где 
 __f_table - таблица_aдресов всех объявленных функций ,
 __v_table  двумерная карта ссылок на таблицу_адресов (__f_table)
__& возврашает ключ (смешение) в таблице






Это сообщение отредактировал(а) mes - 8.4.2008, 10:52


--------------------
PM MAIL WWW   Вверх
Graf_h
Дата 8.4.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mes большое спасибо +1! примерно понял! спасибо smile 


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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