Допустим, есть у меня класс BaseA. У него есть виртуальные и статические методы, а так же конструктор с деструктором.
Когда я делаю выделение памяти BaseA *a = new BaseA();
, как я понимаю создаётся таблица виртуальных методов, в которую записываются все виртуальные функции класса. Туда же, как я понял, записывается и конструктор по-умолчанию.
А куда записываются статические методы, деструктор и другие конструкторы?
Во-первых эта таблица это всего лишь указатель vptr
на статический массив из указателей на функции, поэтому туда только указатели на функции и будут ... а не "сами функции".
Статические методы это глобальные для данного класса функции, которые доступны всем через идентификатор класса Base::MyStaticMethod();
- следовательно их не имеет смысла записывать в эту таблицу.
А указатели на деструкторы должны будут оказаться в этой таблице, иначе, например, деструктор производного класса не вызывался бы при удалении объекта через указатель на базовый - т.е. в такой ситуации
Base* bp = new Derived();
delete bp;
произошла бы утечка памяти
Таблица создается еще при компиляции. При создании объекта в него добавляется указатель на эту таблицу (одну для всех объектов данного класса).
Невиртуальные методы никуда не "записываются", так как еще на этапе компиляции известно, когда они вызываются, так что выполняется просто вызов указанного метода. Например, куда записывается, ну, скажем, функция sin
или printf
? Вот туда же записываются и невиртуальные методы...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
При вызове QFileDialog::getOpenFileName, и попытке преобразования QString в char* или же const char*, происходит либо потеря данных, или что-то еще нехорошее, и VLC отказывается...
Задача есть, нужно отдельно задать функцию со сменным числом параметров, а потом ее вызвать