Вопрос

Я прочитал много людей, пишущих «виртуальный стол, существует для класса, который имеет виртуальную функцию, объявленную в нем».

Мой вопрос: существует ли VTable только для класса, который имеет виртуальную функцию или оно также существует для классов, полученных из этого класса.

например

class Base{
    public:
        virtual void print(){cout<<"Base Print\n";}
};
class Derived:public Base{
    public:
        void print(){cout<<"Derived print\n";}
};

//From main.cpp 
Base* b = new Derived;
b->print();

Вопрос: Был ли нет VTable для получения класса, то вывод не был бы «производным принтом». Таким образом, IMO существует vtable для любого класса, который имеет признание виртуальной функции, а также в классах, наследующих из этого класса. Это правильно ?

Это было полезно?

Решение

Что касается только для виртуальной функциональной функциональности, в традиционном подходе к величиному полученному классу потребуется отдельная версия VTable если и только если Этот полученный класс переопределяет по меньшей мере одну виртуальную функцию. В вашем примере, Derived Переопределяет виртуальную функцию print. Отказ С Derived имеет свою собственную версию print, соответствующий вход в Derived VTable отличается от этого в Base vtable. Обычно это потребует отдельного значения для Derived.

Если Derived Не было ни на что вообще не переопределило, формально оно все еще было бы отдельным полиморфным классом, но для того, чтобы его виртуальные функции были правильно работать, мы могли бы просто использовать Base vtable для Derived также. Итак, технически не будет необходимости в отдельном VTBAL для Derived.

Однако в практических реализациях структура данных, которую мы обычно называем «VTable», часто содержат некоторую дополнительную информацию о классах. Эта дополнительная информация настолько особенная, что большую часть времени становится невозможным делиться VTable между различными классами в иерархии, даже если они используют тот же набор виртуальных функций. Например, в некоторых реализациях указатель VTable хранится в каждом полиморфном объекте указывает на структуру данных, которые также хранятся так называемые «информация RTTI» о классе. По этой причине, в большинстве (если не все) практические реализации каждый полиморфный класс получает свой величин, даже если указатели виртуальной функции, хранящиеся в этих таблицах, одинаковыми.

Другие советы

Да, ваше понимание правильно. Любой класс, который имеет базу с любыми виртуальными функциями, имеет VTable.

Да, это правда. На самом деле, данная дефицит базы:

class derived:public base{
public:
 void print(){cout<<"derived print\n";}
};

полностью эквивалентно:

class derived:public base{
public:
 virtual void print(){cout<<"derived print\n";}
};

... потому что вы уже определили печать как виртуальные в базе.

Я бы хотел, чтобы компилятор принудил это ...

Да, это правда. Класс наследует все участники данных из своего базового класса, включая VTable. Тем не менее, записи VTable регулируются соответственно (например, если класс переопределяет виртуальный метод базового класса, соответствующая запись в VTBAL должна указывать на собственную реализацию).

Но имейте в виду, что концепция «VTable» является обычной практикой, используемой, используемой каждый компилятор, но это не обязательно, ни стандартизировано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top