Форум программистов, компьютерный форум CyberForum.ru

таблица виртуальных функций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 72, средняя оценка - 4.75
Quadro9
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
13.04.2010, 20:40     таблица виртуальных функций #1
объясните плиз кто разбирается..
есть абстрактный класс с двумя виртуальными функциями,
от него наследуются два класса реализующие эти функции по своему..
и есть глобальная функция, которая принимает в параметры абстрактный класс,
и вызывает виртуальные функции..

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

и вот вопрос как глобальная функция узнает какие ей вызывать функции..
у страуструпа что-то про таблицу виртуальных функций написано, но я не понял сколько их, где хранятся и что хранят..

если кто в курсе поподробнее и помедленее, я записую )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
13.04.2010, 21:29     таблица виртуальных функций #2
Объект содержит указатель ( 4 байта ) на таблицу виртуальных функций.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A 
{
public:
    A() : x(0), y(0){ cout << "  constructor  A() \n"; }
    virtual void draw(){ cout << "  draw()  class A \n";}
    int x;
    int y;
};
 
int main()
{
    A a;
    a.x = 0x11223344;
    a.y = 0x55667788;
    return 0;
}
См. рис.
Миниатюры
таблица виртуальных функций  
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.04.2010, 21:32     таблица виртуальных функций #3
Quadro9, в таблице виртуальных функций хранятся указатели на реализации соответствующих функций. Объект же содержит указатель на данную таблицу.
Quadro9
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
13.04.2010, 21:52  [ТС]     таблица виртуальных функций #4
тоесть если брать мой пример, то все объекты наследников будут содержать указатели на таблицу..

таблица хранится у базового класса? в одном экземпляре?
а как она примерно организованна?
потомок1 -> функция1
потомок1 -> функция2
потомок2 -> функция1
потомок2 -> функция2
так?
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
13.04.2010, 22:24     таблица виртуальных функций #5
У каждого класса своя таблица. Один экземпляр для всего класса ( для всех объектов одного класса ).
C++
1
2
3
4
5
6
7
class MyClass
{
public:
    int m;
    int n;
    virtual int func( int k ) { return 0;}
};
В main() :
C++
1
MyClass obj;
Можно запустить программу в режиме отладки ( Run to cursor ) и в окне значений переменных (Locals)
посмотреть, что содержит переменная obj - объект класса MyClass.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
13.04.2010, 23:21     таблица виртуальных функций #6
Вот наилучшее применение виртуальных функций и там написано, много про это, и более простым языком, и так же помимо этого там еще много чего интересного.


Кто хочет знать: что такое COM: сюда
Надеюсь тебе эта книга пригодится.
Последнюю книгу тебе лучше не качать...

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

Добавлено через 3 минуты
Alex5:
Ты прям как я ковырятель программер, я отладчиком тоже частенько пользуюсь.
Quadro9
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
13.04.2010, 23:32  [ТС]     таблица виртуальных функций #7
Вобщем как я это понял..
таблицы имеет каждый класс и базовый и его предки, каждый свою..
и в моем примере функция func вызывает нужную функцию класса основываясь на индексе!!
тоесть в теле функции я вызываю а.f(), и функция понимает что когда я вызову ее с реальным класом надо посмотреть таблицу этого реального класа и вызвать функцию с индексом [0] !

как то так
с кодом и скриншотом понятнее может будет..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
class A {
public:
    virtual void f() = 0;
    virtual void g() = 0;
};
 
class B: public A {
public:
    void f() {std::cout << "Bf\n";}
    void g() {std::cout << "Bg\n";}
};
 
class C: public A {
public:
    void f() {std::cout << "Cf\n";}
    void g() {std::cout << "Cg\n";}
};
 
void func(A& a) {
    a.f();
    a.g();
}
 
int main() {
    B b;
    C c;
    func(b);
}
Миниатюры
таблица виртуальных функций  
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
13.04.2010, 23:53     таблица виртуальных функций #8
А ответ на вопрос, прост.
Каждый созданный Объект имеет свою vtbl - таблицу.
Грубо говоря используя указатель базового класса,
мы получаем в распоряжение адрес объекта, а с ним и его таблицу функций.


Полиморфизм трактуется так: один интерфейс множество реализаций.
Интерфейсом можно назвать базовый абстрактный класс,
а реализации это производные от него классы, имеющие реализации вирт функций.


Через указатель базового класса, так же грубо говоря, мы можем выбирать реализацию:
получать адреса объектов производных классов, а с ними и таблицы с реализациями.

Надеюсь понятна общая философия зачем нужна прошивка иерархии таблицами.

Такой полиморфизм позволяет изменять поведения программы в реальном времени путем
перенаведения указателя базового класса с одного объекта на другой объект производного класса.
Старался объяснить, может тебе более понятно стало.
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
14.04.2010, 01:01     таблица виртуальных функций #9
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Каждый созданный Объект имеет свою vtbl - таблицу.
Не объект, а класс
Каждый класс имеет свою ТВМ ( таблицу виртуальных методов ).
Таблица одна для всего класса.
C++
1
2
3
4
    A a;
    A b;
    a.x = 0x11223344;
    a.y = 0x55667788;
Каждый объект класса, содержащего виртуальные методы, имеет свой указатель на таблицу. На таблицу того класса, к которому этот объект принадлежит.
Миниатюры
таблица виртуальных функций  
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.04.2010, 11:53     таблица виртуальных функций #10
Каждый созданный Объект имеет свою vtbl - таблицу.
Всех тонкостей, я не говорил имеет да имеет,
я говорил в общих чертах, для более детального анализа есть книжки и прочее.

Добавлено через 12 минут
Quadro9:
Если хочешь покопаться в нюансах тебе сюда:
http://www.devdoc.ru/index.php/conte...rtual_base.htm

Добавлено через 6 минут
Каждый созданный Объект имеет свою vtbl - таблицу.
Имеет в своем распоряжения так правильнее.

Добавлено через 1 минуту
Таблица та общая но обращение к ней разных объектов уникальное.

Добавлено через 10 минут

Не по теме:


Каждый созданный Объект имеет свою vtbl - таблицу.
И как я такой бред мог сказать....
Если кого то запутал извиняюсь.



Добавлено через 3 минуты
Alex5:
Не мог бы объяснить что сие значит:
a.x = 0x11223344;
a.y = 0x55667788;
Отладчик без этого не работает или что, или что...
или ты хотел показать что у каждого объекта экземпляр полей данных свой, а таблица одна на всех.
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
14.04.2010, 16:03     таблица виртуальных функций #11
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Alex5:
Не мог бы объяснить что сие значит: ...
C++
1
2
3
    A a;
    a.x = 0x11223344;
    a.y = 0x55667788;
Теперь, я в окне Memory набираю "a" ( см.рис. ), мне сразу понятно, какие байты принадлежат
полю "a.x", какие "a.y"
Миниатюры
таблица виртуальных функций  
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
14.04.2010, 16:17     таблица виртуальных функций #12
В окне дизассемблера можно посмотреть, как вызывается виртуальная функция.
C++
1
2
3
    A * p = new B;
    // ...
    p->draw();
Миниатюры
таблица виртуальных функций  
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.04.2010, 16:33     таблица виртуальных функций #13

Не по теме:

Alex5:
У тебе VC++ 6.0 что то очень похоже на этот отладчик.


Тоже им пользуюсь.

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

И компилятор работает на основании стандарта 98 года, сейчас актуален стандарт 2003.
Проекты VC++ 6.0 не будут нормально совместимы с новыми средами разработки,
все из-за устаревшего стандарта. Короче менять среду разработки все равно придется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2010, 17:05     таблица виртуальных функций
Еще ссылки по теме:

Замена виртуальных функций шаблонами C++
Странное наследование виртуальных функций C++
C++ Механизм виртуальных функций

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
14.04.2010, 17:05     таблица виртуальных функций #14
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Если у тебя VC++ 6.0 лучше поменяй его, поскорей, что бы сильно не привыкать к нему
Да, согласен.
Не привыкать... Да, пожалуй уже привык
Цитата Сообщение от Genius Ignat Посмотреть сообщение
просто эта версия уже морально устарела, да и некоторым стандартам C++ не соответствует.
Пример. Частичная специализация шаблонов классов - компилятор VS-6 выдаёт ошибку.
C++
1
2
3
4
5
6
7
8
9
10
11
template < typename T1, typename T2 >  class MyClass
{
    T1 t1;
    T2 t2;
};
 
template < typename T>  class MyClass< T, T>
{
    T t1;
};  // error C2989: 'MyClass<T1,T1>' : template class has already 
//been defined as a non-template class
Yandex
Объявления
14.04.2010, 17:05     таблица виртуальных функций
Ответ Создать тему
Опции темы

Текущее время: 12:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru