Why would you want to prevent use? Even if you (somehow) do prevent it so that the following (A) fails to compile:
Triangle t;
Concrete x;
x.visit(t);
the following (B) will still work:
Triangle t;
Concrete x;
static_cast<Virtual&>(x).visit(t);
So IMO, it doesn't make sense to try to prevent it from being called. I would solve the warning by adding a using declaration into the Concrete
class, like this:
struct Concrete : public Virtual
{
using Virtual::visit;
void visit( Square& obj ) {}
void visit( Circle& obj ) {}
};
This will silence the warning, and enable (A). But I don't believe it's wrong to enable (A) in this case.