template
std::stringstream& operator%(std::stringstream& left, T right) {
left << right;
return left;
}
int main() {
std::stringstream out;
std::string val = "hello world";
int p = 100500;
out % '[' % val % " : " % p % ']';
std::cout << out.str();
return 0;
}
Поэтому, и public и protected методы должны в равной степени заботиться о состоянии объекта, а методы, переопределенные в наследниках - заботиться о том, чтобы сохранялись все поведенческие черты родительского метода. Интерфейс метода - это НЕ ТОЛЬКО его параметры и возвращаемое значение. Это еще и все то, что клиентский код ожидает от класса, что описывается в документации и согласуется с общей логикой класса (это к примеру о методе add).