Почему мой компилятор настаивает на неиспользуемых определениях функций только для виртуальных?

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

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

struct Animal
{
    void unusedFunc();          // <--- Regardless of whether class is instantiated, this does not need to be defined unless it is called
    virtual void unusedVirtualFunc(); // <--- Has to be defined whether or not it is called, but only if this class is instantiated.
};

int main()
{
    Animal dog1;          // <--- This line now means the virtual function has to be defined. Doesn't affect the non-virtual function at all.
}

Как только я добавляю ключевое слово virtual, размер моего класса увеличивается до 8 байт (указатель vtable). Путешествуя туда, куда указывает указатель vtable, я думаю, что приду к vtable, в которой есть инструкции, необходимые для выполнения функции, относящейся к объекту, идентифицированному во время выполнения, но я не вижу необходимости в том, чтобы это определение функции было в vtable вообще. Извините, если это очевидный вопрос.

Кроме того, я на Visual Studio.

Изменить: вот некоторый компилируемый код:

struct Animal
{
    void unusedFunc();
    virtual void unusedVirtualFunc();
};


int main()
{
    Animal dog1;
}

person Zebrafish    schedule 22.12.2016    source источник
comment
Компоновщик напомнит вам, что ему нужен адрес функции, чтобы заполнить v-таблицу для класса.   -  person Hans Passant    schedule 22.12.2016
comment
Было бы полезно, если бы вы разместили компилируемый код. Вам не хватает возвращаемого типа для unusedVirtualFunc и завершающей точки с запятой в структуре Animal.   -  person PaulMcKenzie    schedule 22.12.2016
comment
@PaulMcKenzie Спасибо, я исправил и добавил это.   -  person Zebrafish    schedule 22.12.2016
comment
Проблема не возникает для g++   -  person PaulMcKenzie    schedule 22.12.2016