Case 1:
class T{};
class A {
public:
virtual void m(T t) { ... }
};
class B : public A {
public:
void m(const T t){ ... }
};
int main(){
T t;
B b;
A* a = &b;
a->m(t);
}
Case 2:
class T{};
class A {
public:
virtual void m(T& t) { ... }
};
class B : public A {
public:
void m(const T& t){ ... }
};
int main(){
T t;
B b;
A* a = &b;
a->m(t);
}
case 1 : a->m(t) (in main) calls B::m(T) (overriding)
case 2 : a->m(t) (in main) calls A::m(T) (overloading)
Why does T& vs const T& is a type mismatch but T vs const T is not?