You must use a pointer to the base class. Not the class you call Base_class (very bad name by the way) for virtual functions to work correctly. Also, only the base class needs to define the func() as virtual.
Run the code below:
#include <stdio.h>
class Interface_class
{
public:
virtual void Func(const char *str){ printf("Interface Class char\n"

; }
virtual void Func(int ii){ printf("Interface Class int\n"

; }
};
class Base_class: public Interface_class
{
public:
void Func(const char *str){ printf("Base Class %s\n", str); }
void Func(int ii){ printf("Base Class %d\n", ii); }
};
class Derived_class: public Base_class
{
public:
void Func(int ii){ printf("Derived Class %d\n", ii+1); }
};
int main(void)
{
Interface_class* pInterfaceClass;
Interface_class interface_ptr;
Base_class base_class;
Derived_class derived_obj;
// use interface class func()
pInterfaceClass = &interface_ptr;
pInterfaceClass->Func("aaaa"

;
pInterfaceClass->Func(4);
// use derived class func()
pInterfaceClass = &base_class;
pInterfaceClass->Func("bbbb"

;
pInterfaceClass->Func(5);
// use derived class func()
pInterfaceClass = &derived_obj;
pInterfaceClass->Func("aaaa"

;
pInterfaceClass->Func(4);
return(0);
}
Brother C