Вы не можете сделать это с наследованием. Имея указатель на baseclass
, компилятор знает только, что он имеет функцию public
virtual
, поэтому позволяет вызывать функцию соответствующим образом.
Производный класс решил наследовать от базового класса и реализовал функцию с другим доступом. Но ничего из этого не видно, учитывая только указатель на базу.
Ничто не мешает реализации derivedclass::printmynumber()
ничего не делать - это означает, что если код вызывает его, заметного эффекта не будет (при условии, что отсутствие ожидаемого эффекта допустимо).
Настоящее решение состоит в том, чтобы исправить ваш дизайн, а не пытаться обойти его недостатки. Не наследуйте derivedclass
от baseclass
. Таким образом, никакая функция-член derivedclass
не может быть вызвана вообще, учитывая только указатель на baseclass
, так как типы не связаны (передача derivedclass *
функции, ожидающей baseclass *
, обычно диагностируется как ошибка).
Кстати: main()
возвращает int
, а не void
. Некоторые компиляторы поддерживают void main()
как нестандартное расширение (а документация для некоторых из этих компиляторов ошибочно описывает такую вещь как стандарт), но этого лучше избегать.