Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таблица виртуальных методов / 25 сообщений из 32, страница 1 из 2
10.08.2021, 12:23
    #40089825
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Создаю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Parent {
    FunctionPointer *__vptr; // здесь

public:
   virtual void a();
   virtual void b();
}

class Child {
    FunctionPointer *__vptr; // здесь

public:
   virtual void a();
   virtual void b();
}



Создаю


Код: plaintext
1.
2.
3.
Child c1 = new Child();

Child c2 = new Child();



Сколько таблиц виртуальных методов будет создано ?
...
Рейтинг: 0 / 0
10.08.2021, 12:34
    #40089828
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Таблицы виртуальных методов статические, они не создаются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2021, 12:37
    #40089829
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Да но там ведь хранятся реальные адреса методов a,b

А эти реальные адреса для каждого инстанса свои

Разве не так ?
...
Рейтинг: 0 / 0
10.08.2021, 12:40
    #40089831
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
У каждого типа, а не у каждого экземпляра.
...
Рейтинг: 0 / 0
10.08.2021, 12:42
    #40089832
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Basil A. Sidorov
У каждого типа, а не у каждого экземпляра.


Но физически в памяти у каждого метода ведь свой адрес так ?
...
Рейтинг: 0 / 0
10.08.2021, 12:45
    #40089834
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
И?
Есть пачка таблиц с адресами виртуальных методов. По одной таблице на каждый тип с виртуальными методами.
Есть конкретный экземпляр с указателем на конкретную таблицу.
...
Рейтинг: 0 / 0
10.08.2021, 12:45
    #40089835
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
shellyeА эти реальные адреса для каждого инстанса свои

Нет, для всех инстансов они одинаковые.

У классов данные - отдельно, код - отдельно. Оператор new создаёт только место под данные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2021, 12:45
    #40089836
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Ну вот

инстанс Child c1 у него у метода a адрес 0x01
инстанс Child c2 у него у метода a адрес 0x02

В одну и ту же таблицу как то запишется 0x01 и 0x02 ?
...
Рейтинг: 0 / 0
10.08.2021, 12:46
    #40089838
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov

shellyeА эти реальные адреса для каждого инстанса свои

Нет, для всех инстансов они одинаковые.

У классов данные - отдельно, код - отдельно. Оператор new создаёт только место под данные.


А теперь понял

Спасибо !
...
Рейтинг: 0 / 0
10.08.2021, 12:51
    #40089839
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov

shellyeА эти реальные адреса для каждого инстанса свои

Нет, для всех инстансов они одинаковые.

У классов данные - отдельно, код - отдельно. Оператор new создаёт только место под данные.
Плюс на указатель на VMT
...
Рейтинг: 0 / 0
10.08.2021, 12:56
    #40089841
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
SiemarglПлюс на указатель на VMT

Если быть совсем точным, то по указателю на каждый виртуальный родительский класс, но это
тоже данные, в точности как написано в стартовом посте, так что общей картины оно не меняет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2021, 13:01
    #40089845
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov

У классов данные - отдельно, код - отдельно. Оператор new создаёт только место под данные.


Вы мне прямо глаза открыли

Я то все время думал что сегмент когда каждый раз новый для каждого нового инстанса

И никак в голове не клеилось с VMT
...
Рейтинг: 0 / 0
10.08.2021, 23:54
    #40089974
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
shellye,
одна...
...
Рейтинг: 0 / 0
10.08.2021, 23:54
    #40089975
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
shellye
Да но там ведь хранятся реальные адреса методов a,b

А эти реальные адреса для каждого инстанса свои

Разве не так ?


Не так.
...
Рейтинг: 0 / 0
16.08.2021, 12:04
    #40090973
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
shellye
Basil A. Sidorov
У каждого типа, а не у каждого экземпляра.
Но физически в памяти у каждого метода ведь свой адрес так ?
Физически в памяти существует только одна статическая таблица виртуальных методов на каждый класс с виртуальными методами, создающаяся на этапе компиляции. Каждый экземпляр класса с виртуальными методами первым своим неявным элементом имеет указатель на эту самую таблицу виртуальных методов, причём, в процессе создания и уничтожения экземпляра класса, наследующего класс с виртуальными методами, этот указатель меняется с таблицы базового класса до таблицы наследника и обратно (при выполнении деструктора).
...
Рейтинг: 0 / 0
16.08.2021, 12:51
    #40090992
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
rdb_devсуществует только одна статическая таблица виртуальных методов на каждый класс с
виртуальными методами

Несколько. На каждого предка по одной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.08.2021, 13:08
    #40090997
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov, я так и написал - "одна на каждый класс с виртуальными методами". Формулировки разные, смысл один.
...
Рейтинг: 0 / 0
16.08.2021, 13:13
    #40090999
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
"Одна на каждого предка с виртуальными методами каждого класса с виртуальными методами"
тогда уж...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.08.2021, 13:18
    #40091001
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov, можно и так...
Но не обязательно "предка". Просто - каждого класса с виртуальными методами (независимо от наследования).
...
Рейтинг: 0 / 0
16.08.2021, 14:45
    #40091028
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
rdb_dev
shellye
пропущено...
Но физически в памяти у каждого метода ведь свой адрес так ?
Физически в памяти существует только одна статическая таблица виртуальных методов на каждый класс с виртуальными методами, создающаяся на этапе компиляции. Каждый экземпляр класса с виртуальными методами первым своим неявным элементом имеет указатель на эту самую таблицу виртуальных методов, причём, в процессе создания и уничтожения экземпляра класса, наследующего класс с виртуальными методами, этот указатель меняется с таблицы базового класса до таблицы наследника и обратно (при выполнении деструктора).

Да ладно только одна... А как же тогда работает вызов виртуальных методов, если в распоряжении у нас только адрес виртуального метода базового класса?
...
Рейтинг: 0 / 0
16.08.2021, 14:48
    #40091030
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
petravесли в распоряжении у нас только адрес виртуального метода базового класса?

Это в каких случаях такое бывает?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.08.2021, 17:42
    #40091074
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov

petravесли в распоряжении у нас только адрес виртуального метода базового класса?

Это в каких случаях такое бывает?

Получаем адрес виртуального метода базового класса. Указатель указывает на объект наследника.
Вызываем - и вызывается метод класса наследника.
...
Рейтинг: 0 / 0
16.08.2021, 19:45
    #40091097
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
petravПолучаем адрес виртуального метода базового класса.

Всё равно не понял. Можно кодом?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.08.2021, 21:55
    #40091112
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
Dimitry Sibiryakov

petravПолучаем адрес виртуального метода базового класса.

Всё равно не понял. Можно кодом?..

Ну примерно так:

Код: plaintext
1.
2.
3.
auto ptr = &Base::virtualMethod;
Base *obj = new Derived();
(obj->*ptr)();


Вызвался метод класса наследника, а адрес брали у метода предка.
...
Рейтинг: 0 / 0
16.08.2021, 22:23
    #40091116
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица виртуальных методов
petravадрес брали у метода предка.

Уверен, что адрес берётся у предка?..
[src]#include <stdio.h>

struct Base
{
virtual void virtualMethod() { printf("Base\n"); }
};

struct Derived: public Base
{
void virtualMethod() override { printf("Derived\n"); }
};

int main()
{
auto ptr = &Base::virtualMethod;
Base b;
Derived d;
printf("Base::virtualMethod = %p, Derived::virtualMethod = %p, ptr = %p\n",
&b.virtualMethod, &d.virtualMethod, ptr);
Base *obj = new Derived();
(obj->*ptr)();
}
[src]
Base::virtualMethod = 000000000023FDF0, Derived::virtualMethod = 000000000023FDE0, ptr =
000000000023FDD0
Derived
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таблица виртуальных методов / 25 сообщений из 32, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]