Я НИКОГДА не заботился о размере vtable. Это обычно относительно мало, и есть только одно объявление класса. То, что намного более надоедливо, - это дополнительное пространство, занимаемое экземплярами класса, поскольку, за исключением одиночных, экземпляры классов часто бывают многих. Поэтому добавление дополнительных элементов в класс, так или иначе, безусловно повлияет на объем памяти. Если это ДЕЙСТВИТЕЛЬНО беспокоит вас, что vtable слишком велик, то выполните некоторую редизайн, чтобы не было так много различных виртуальных функций-членов (возможно, разделение иерархии классов на несколько классов) или меньше производных классов. Но действительно, даже если у вас есть сотни классов, каждый из которых имеет сотню функций виртуального члена, он по-прежнему относительно невелик - 200 классов со 100 членами будут занимать 20000 * 8 байт на запись [64-разрядная архитектура] -> 160 КБ. Разумеется, 20000 функций [да, теоретически, вам нужна только одна новая функция для производного класса для новой виртуальной таблицы, но это довольно глупый дизайн, настолько маловероятный на самом деле]
Назначение ключевого слова final
убедитесь, что вы не извлекаете из него дальше - это полезно, например, если у вас есть базовая иерархия классов, где некоторая конкретная функция не должна «изменяться». Скажем, например, у вас есть:
class user_base
{
public:
virtual bool check_password(); {... magical code .. };
virtual bool is_super_user() = 0;
};
class superuser : public user_base
{
public:
virtual bool check_password() final
{ .... magical code ...
... extra checks to ensure no remote login...
}
virtual bool is_super_user() final { return true; }
};
class user : public user_base
{
public:
virtual bool is_super_user() final { return false; }
};
Вы должны обмануть вокруг немного, чтобы убедиться, что user_base
не используется в качестве базового класса для fake_super_user
, и, конечно же, есть и другие вопросы, BIG безопасности с такой дизайн, но это дает вам некоторую идею.
No. Компилятор даже не знает, что 'Bar' существует (при условии, наиболее распространенный случай, когда он находится в другой единицы перевода с отключенной оптимизацией цельной программы), когда он определяет, как компилировать код, который вызывает 'Foo :: fn'. Почему вы беспокоитесь о размере vtable? – Cameron
Я подозреваю, что таблица vtable остается того же размера, но окончательные отметки, поэтому компилятор не разрешает переопределения в производных классах – cppguy
Обычно в классах нет vtables. Экземпляры содержат vptrs. –