Связь между указателем This и функциями Vtable - PullRequest
1 голос
/ 18 марта 2011

Я не имею большого представления о функциональности виртуальной таблицы, но в приведенном ниже коде - переданный указатель this, очевидно, указывает на разные местоположения в 2 случаях - но функция show() в памяти - это экземпляр / смысл создается отдельно для каждого объекта во время выполнения? (Простите за плохое понимание жаргонов C ++)

#include<iostream>
using namespace std;
class A
{
      int x;
      public:
            A(){x=0;}
            A(int z){x=z;}
            void show()
            {  
                 if(x==0)
                 cout<<"\nCalled by OBJ_1";
                 else
                 cout << "\nCalled by OBJ_2";
            }
};

int main()
{
 A OBJ_1,OBJ_2(1);
 OBJ_1.show();
 OBJ_2.show();
}

Если бы можно было привести пример (с некоторыми диаграммами памяти, если это возможно) относительно того, как работает Виртуальная таблица и функциональность указателя this с виртуальной таблицей w.r.t, я был бы очень признателен.

Ответы [ 3 ]

7 голосов
/ 18 марта 2011

A вообще не имеет vtable (или не должно быть на любом хорошем компиляторе), потому что это не полиморфный класс: у него нет виртуальных функций-членов.

Функция show() существует в исполняемом файле ровно один раз. Функции-члены на самом деле не отличаются от обычных функций, не являющихся членами, они просто имеют дополнительный неявный параметр this. Вы можете думать об этом, как будто компилятор преобразует функцию-член в похожую функцию, не являющуюся членом, например:

void show(A* this)
{
    if (this->x == 0)
        cout << "\nCalled by OBJ_1";
    else    
        cout << "\nCalled by OBJ_2";  
}

Вместо OBJ_1.show() аналогичным способом вызова этой функции, не являющейся членом, будет использование show(&OBJ_1).

Не существует ни одного A::show() на A созданного объекта. Всего один A::show(), и он принимает в качестве аргумента экземпляр, по которому он был вызван.

1 голос
/ 18 марта 2011

Стандарт C ++ не определяет термин «виртуальная таблица» явно. Реализация свободна для реализации полиморфного класса (класса, который имеет хотя бы одну виртуальную функцию) любым удобным для него способом. Но в большинстве распространенных реализаций используется v-таблица с v-ptr.

Посмотрите, что Маршалл Клайн говорит о виртуальных функциях

0 голосов
/ 18 марта 2011

Нет, существует только одна копия кода, соответствующего каждой функции (член или не член).Функция использует указатель this, чтобы определить, с каким объектом на самом деле работать.

У вас нет методов virtual, поэтому в вашем коде вообще нет vtable.

...