これでどうだ。仮想継承にしなくても当然適切な関数が呼ばれるが一応そうした。
struct a {virtual void FuncA() = 0;};
struct b {virtual void FuncB() = 0;};
struct interface_ab : virtual public a, virtual public b {};
struct A : virtual public a {
    void FuncA() {
        std::cout << "A::FuncA" << std::endl;
    }
};
struct ab : public interface_ab {
    void FuncA() {
        std::cout << "ab::FuncA" << std::endl;
    }
    void FuncB() {
        std::cout << "ab::FuncB" << std::endl;
    }
};
struct Ab : virtual public A, virtual public ab {
    void FuncA() {
        A::FuncA();
    }
};
void c(interface_ab& hoge) {
    hoge.FuncA();
    hoge.FuncB();
}
int main() {
    Ab obj;
    c(obj);
}