if(true) B* test = new B();
else if(false) C* test = new C();
test->init(); // вываливается ошибка, что мол он про test ничего не знает.
Да, т.к. область видимости test закончилась (он существует только в плече if)
Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные?
Нужно, но не все возможные а те что собираетесь пользовать и перекрывать, напр init()
Имелся ввиду более широкий смысл, так если вдруг в встретится метод отсутствующий в базовом классе все будет поламато.
Пример
C++ (Qt)
B * test = 0;
test = new C();
test->init();
При виртуальном init будет вызван C::init(). Если у С нет своего init, то будет вызван B::init(), т.к. C наследует B.Но компилятор не позволит вызвать метод C которого нет у B, т.к. test объявлен как указатель на B. Если такая (подозрительная) необходимость возникла, надо привестись
C++ (Qt)
C * testC = dynamic_cast <C *> (test);
if (testC)
testC->MethodC();
В общем, в учебнике все это есть, поэтому умолкаю