#include <iostream>

class A {
public:
    virtual int a1() = 0;
    int a2() {
        return a3();
    }
protected:
    int a3() {
        return a1();
    }
};

class B : public A {
public:
    virtual int a1() {
        return 1;
    }
};

int main() {
    B b_obj;
    int value1 = b_obj.a2(); // This fails for OP.
    std::cout << value1 << std::endl;
    return 0;
}