powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таблица виртуальных методов
25 сообщений из 32, страница 1 из 2
Таблица виртуальных методов
    #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
Таблица виртуальных методов
    #40089828
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблицы виртуальных методов статические, они не создаются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Таблица виртуальных методов
    #40089829
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да но там ведь хранятся реальные адреса методов a,b

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

Разве не так ?


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

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

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

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

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

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

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

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

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

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

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

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


Вызвался метод класса наследника, а адрес брали у метода предка.
...
Рейтинг: 0 / 0
Таблица виртуальных методов
    #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
25 сообщений из 32, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таблица виртуальных методов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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