子クラス B を持つクラス A があり、A と B の仮想関数を呼び出すテンプレート関数を作成したいと考えています。
#include <stdio.h>
class A{
public:
virtual void test(){
printf("A\n");
}
};
class B:public A{
public:
virtual void test(){
printf("B\n");
}
};
template<class T>
void f(T t){
t.test();
}
int main(){
A* a=new B();
f<A>(*a);
return 0;
};
A のみを出力し、test() をオーバーライドしないようですが、変更すると
void f(T t)
に
void f(T& t)
そのように:
#include <stdio.h>
class A{
public:
virtual void test(){
printf("A\n");
}
};
class B:public A{
public:
virtual void test(){
printf("B\n");
}
};
template<class T>
void f(T& t){
t.test();
}
int main(){
A* a=new B();
f<A>(*a);
return 0;
};
、それはBを出力します、なぜそれが起こるのでしょうか?