Однако я получаю сообщение об ошибке компилятора, говорящее о том, что я не могу инициализировать строку с -1.0, что означает, что компилятор пытается вызвать base :: get (), когда я вызываю d.print ().
Нет, эта ошибка компилятора означает, что компилятор пытается создать экземпляр base<std::string>::get()
, что он должен сделать, потому что derived
использует base<std::string>
в качестве базового класса. То, что вы не вызываете функцию, не означает, что вы не можете . Вы все еще можете позвонить base<std::string>::get()
напрямую.
Вы создали экземпляр base<std::string>
и использовали его в качестве базового класса. Поскольку base<std::string>::get()
является виртуальной функцией, она считается «используемой» тем, что вы используете base<std::string>
в качестве базового класса. Поскольку он используется, он должен быть создан. Таким образом, компилятор должен и попытается скомпилировать функцию.
И поскольку std::string
не может быть неявно создан из числа с плавающей запятой, компилятор выдает ошибку из-за неудачной замены шаблона.