Виртуальная функция в базовом классе позволяет наследникам предоставлять ее переопределение. Когда базовый класс (или внешние вызывающие абоненты, воспринимающие его как базовый класс) вызывает функцию в производном экземпляре, он знает, что нужно искать это переопределение в производном классе, а не использовать тот, что в базовом классе.
Если вы управляете базовым классом List (в отличие от предоставленного базового класса), вы можете реструктурировать его, чтобы использовать виртуальные функции в ключевых местах, чтобы производный класс ListList мог перенаправлять их в свою собственную логику, оставаясь при этом доступным для доступа к коду например, как список, так что вы можете создать список и передать его чему-то, ожидающему список.
Но если вы не можете изменить Список и у него еще нет виртуальных функций, которые вы можете переопределить, вы не сможете это сделать. Возможно, вам придется искать другой (более низкий) базовый класс или создать ListList (или LinkedList?) Как отдельный класс, а не как производный. Он мог бы предоставить функцию ToList () для экспорта своего содержимого в виде стандартного List (и конструктор, принимающий функцию List и / или From (List) для импорта из List обратно в ListList). Но, вероятно, это больше работы, чтобы использовать его таким образом, в зависимости от того, что вам на самом деле нужно делать с ним, который вы изначально рассчитывали получить из List.
Отредактировано: С кодом, который вы сейчас разместили, похоже, что наследование может быть не тем, что вам действительно нужно, в конце концов, как указывает @rmn. Поэтому, хотя этот ответ, как мы надеемся, немного объясняет, как работают виртуальные функции (применительно к первоначально заданному вопросу), он может не относиться к тому, что вы действительно пытаетесь сделать с двумя классами.