Selection of operator<< is based on static type of your object known during compilation time. To achieve what you want do not define two operator<< function, but one only in BASIC1:
friend std::ostream& operator<<(std::ostream& os, const BASIC1& basic) {
Write(os);
return os;
}
and define virtual function Write in both BASIC1 and BASIC2 to do what you want:
virtual void Write(std::ostream& os) const {
os << "BASIC1 object";
}