Я нахожу довольно странным, что неиспользуемые виртуальные функции все еще должны быть определены, в отличие от неиспользуемых обычных функций. Я немного понимаю неявные vtables и vpointers, которые создаются при создании объекта класса - это в некоторой степени отвечает на вопрос (что функция должна быть определена так, чтобы указатели на можно определить виртуальную функцию), но это отодвигает мой запрос еще дальше.
Зачем нужно создавать запись vtable для функции, если нет абсолютно никакой вероятности, что виртуальная функция вообще будет вызвана?
class A{
virtual bool test() const;
};
int main(){
A a; //error: undefined reference to 'vtable for A'
}
Несмотря на то, что я объявил A::test()
, он никогда не использовался в программе, но все равно выдает ошибку. Может ли компилятор не запустить программу и понять, что test()
никогда не вызывался, и, следовательно, не требовать для него записи vtable? Или это неразумно ожидать от компилятора?