Я думаю, что у моего понимания есть вмятина, и я хотел бы уточнить кое-что. Это правда, что мы всегда должны следовать золотому правилу, бросать по значению, ловить по ссылке. И если я выбрасываю производный объект и ловлю по базе, дополнительные части производного будут нарезаны. НО, когда я бросаю производный объект и ловлю базовый объект по ссылке, нарезка не должна происходить. Правильно?
Рассмотрите этот код:
class Base {
public:
void print() {
std::cout << "base print" << std::endl;
}
};
class Derived : public Base {
public:
void d_print() {
std::cout << "derived print" << std::endl;
}
};
int main() {
try {
Derived d;
throw d;
} catch (Base& db) {
db.print();
db.d_print();
}
}
Это не компилируется. Я думал, что не будет никакой нарезки, и db.d_print () вызовет d_print из Derived. Что я пропустил?