#include #include struct Base { virtual int score() const { return 1; } virtual ~Base() = default; }; struct Derived : Base { int score() const override { return 9; } }; struct StaticScore { int score() const { return 4; } }; template int evaluate(const T& object) { return object.score(); } bool is_derived(const Base& object) { return dynamic_cast(&object) != nullptr; } int main() { StaticScore fixed; assert(evaluate(fixed) == 4); Derived derived; Base& reference = derived; Base sliced = derived; assert(evaluate(reference) == 9); assert(sliced.score() == 1); assert(dynamic_cast(&reference) == &derived); assert(is_derived(reference)); assert(!is_derived(sliced)); assert(typeid(reference) == typeid(Derived)); bool failed = false; try { (void)dynamic_cast(sliced); } catch (const std::bad_cast&) { failed = true; } assert(failed); }