Описание тега vptr

Справочник по виртуальному указателю C++.
8 ответов

Динамическое изменение виртуального указателя во время выполнения

Допустим, у меня есть два класса, которые наследуют базовый класс, который имеет чисто виртуальную функцию. Оба класса реализуют свою собственную версию этой функции, но не добавляют дополнительных переменных-членов, поэтому они имеют одинаковый раз…
06 ноя '11 в 03:11
3 ответа

C++: прототип виртуального указателя

Я не уверен, документировано ли это где-нибудь. Все мы знаем, что в случае виртуальных функций каждый класс содержит vptr, указатель на массив указателей функций, называемый виртуальной таблицей. Я хочу знать, что является прототипом vptr. Например,…
03 июн '12 в 17:38
4 ответа

Когда V-таблица создается для класса?

Я знаю, что реализация разрешения вызовов виртуальных функций не является частью стандартов C++ и ничего не говорит о vptr или v-table, но позвольте мне задать этот вопрос здесь. Я слышал, что v-таблица - это распространенный метод, используемый ком…
21 ноя '10 в 17:59
2 ответа

Наличие VPTR у подобъектов

У меня есть класс 'base' с виртуальным деструктором и, следовательно, с VTable и соответствующим VTPR в нем, и класс, производный от него: class base { public: virtual ~base() {} }; class der : base {}; main() { int a = sizeof(base); // = 4 , fine !…
05 июн '12 в 14:35
1 ответ

В MSVC ABI, как мне надежно найти vtable, учитывая только (void*)?

Этот вопрос конкретно о непереносимых материалах MSVC ABI. Я пытаюсь написать эквивалент C++ typeid в явно непортативном, но не волшебном C++. Для Itanium ABI (как используется в Linux/Mac) это очень просто: const std::type_info& dynamicast_type…
18 июн '17 в 18:34
3 ответа

Неожиданная отправка виртуальной функции при использовании ссылки на базовый класс вместо указателя

Допустим, у меня есть простая иерархия классов следующим образом с общим API: #include <memory> class Base { public: void api() { foo(); } protected: virtual void foo() { std::cout << "Base" << std::endl; } }; class FirstLevel : pu…
1 ответ

C++ vtable в множественном наследовании, указатель на метод thunk

Я прочитал эту статью: https://shaharmike.com/cpp/vtable-part2/ И я не могу понять, почему в vtable (в конце статьи) у нас есть такой указатель: 0x400918 0x400820 не виртуальный Thunk для Child::FatherFoo() но не указатель непосредственно на метод C…
8 ответов

Почему вптр не стоит на месте?

С каждым классом, который содержит одну или несколько виртуальных функций, связана Vtable. Пустой указатель vptr указывает на эту таблицу. Каждый объект этого класса содержит тот vptr, который указывает на тот же Vtable. Тогда почему vptr не статиче…
17 дек '12 в 12:26
4 ответа

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

Я читаю Внутри объектной модели C++. В разделе 1.3 Итак, почему же это, учитывая Bear b; ZooAnimal za = b; // ZooAnimal::rotate() invoked za.rotate(); Вызванный экземпляр rotate() - это экземпляр ZooAnimal, а не экземпляр Bear? Более того, если иниц…
5 ответов

Понимание vptr в множественном наследовании?

Я пытаюсь разобраться в утверждении в книге эффективно C++. Ниже приведена схема наследования для множественного наследования. Теперь в книге говорится, что для каждого vptr требуется отдельная память в каждом классе. Также это делает следующее утве…
2 ответа

Выбор vptr в случае множественного наследования

Это похоже на многие предыдущие вопросы, но спрашивает что-то, на что я не смог найти ответ. #include <iostream> using namespace std; class Base1 { public: int b1_data; virtual void b1_fn() {cout << "I am b1\n";} }; class Base2 { public:…
5 ответов

Ссылочные переменные и наследование

Следующий код: #include <stdio.h> class Parent { public: virtual void func() {printf("Parent\n");} }; class Child1 : public Parent { virtual void func() {printf("Child1\n");} }; class Child2 : public Parent { virtual void func() {printf("Child…
22 ноя '11 в 10:23
1 ответ

Получить виртуальную таблицу класса без объекта

Я пытаюсь реализовать систему, аналогичную первой, описанной здесь. То есть (ab) использование модификации vtable для изменения поведения объекта во время выполнения. Это часть моих попыток создать эффективную оболочку общего типа в проекте C++, над…
04 мар '16 в 16:48
4 ответа

Альтернативные схемы для реализации вптр?

Этот вопрос не о самом языке C++ (т.е. не о стандарте), а о том, как вызвать компилятор для реализации альтернативных схем для виртуальной функции. Общая схема реализации виртуальных функций заключается в использовании указателя на таблицу указателе…
3 ответа

Сколько vtable и vpointers будет создано в этом примере?

Вот программа на vtables. Я правильно понимаю на vtables и v-указателей. Class B { public: virtual Void Hello() { cout<<"Hello Base"; } }; class D: public B { public: virtual void Hello() { cout<<"Hello Derived"; } }; int main(int argc, …
19 апр '14 в 12:39
1 ответ

Dynamic_cast на не полиморфных типах

Я могу понять, почему dynamic_cast работает в этом случае: #include <iostream> struct A{ virtual ~A() = default; }; struct B { virtual ~B() = default; }; struct C : A, B{}; void f(const A &a) { if(auto p = dynamic_cast<const B*>(&amp…
3 ответа

Где переопределенный виртуальный метод, сохраненный в vtable C++ в множественном наследовании

В C++ нет представления классов во время выполнения, но я всегда могу вызвать переопределенный виртуальный метод в производном классе. где этот переопределенный метод сохранен в vtable? Вот фрагмент кода для демонстрации: struct B1 { virtual void f(…
2 ответа

C++: помогите понять эту строку кода

Я искал способ получить доступ к vtable напрямую через указатель и наткнулся на этот пост: http://www.codeproject.com/Tips/90875/Displaying-vtable-when-debugging Он работает нормально, и я могу вызывать функции через записи vtable. Но у меня возника…
06 дек '14 в 11:56
2 ответа

Разве размер vptr на 64-битных компьютерах ** должен ** быть 64-битным?

Мне любопытно, почему размер vptr занимает 64 бита на 64-битных машинах и действительно ли это требуется в C++. Все, что нужно сделать vptr, это указать на vtables, и поскольку vtables не может занимать слишком много памяти и может быть сгруппирован…
30 ноя '17 в 01:14
2 ответа

Где vptr (виртуальный указатель) инициализируется в классе, имеющем только параметризованные конструкторы?

Предположим, у меня есть такой класс class Base { private: int i; int j; public: Base(int i) { this->i = i; j = 0; } Base(int i, int j) { this->i = i; this->j = j; } virtual void f() { cout<<"in base f()"<<endl; } }; VPTR инициа…
22 ноя '12 в 07:16