Both are resolved at run time Overloading is resolved at compile time; overriding a virtual function is resolved at run time Overriding requires different parameter lists Overloading requires inheritance
It causes a SyntaxError It makes the attribute read-only The name is mangled to _ClassName__secret but is still accessible from outside It is truly private and inaccessible
It is a member function with public access It is inherited by derived classes It is not a member of the class but can access the class's private members It must be declared virtual
Only for const-correctness Because constructors cannot take value parameters References are faster Passing by value would require calling the copy constructor itself, causing infinite recursion