Consider the following code:
class A { public: virtual ~A() { } virtual void print() const { std::cout << "In A" << std::endl; } }; class B : public A { public: B() { } virtual ~B() { } virtual void print() const { std::cout << "In B" << std::endl; } }; void doSomething(A* a) { a->print(); } void doSomething(const A a) { a.print(); } int main() { A* a = new B(); doSomething(a); doSomething(B()); return 0; } Why does this output:
In B In A But when you change doSomething to doSomething(const A& a) it outputs:
In B In B