class GA
{
public:
virtual int f()
{
return 1;
}
};
class GB :public GA
{
public:
virtual int f()
{
return 2;
}
};
void show(GA g)
{
cout << g.f();
}
void display(GA& g)
{
cout << g.f();
}
void main()
{
GA a;
show(a);
display(a);
GB b;
show(b);
display(b);
}
输出的是1112;
为什么show(b)调用的还是基类的函数 但display(b)调用的却是派生的函数呢?
函数参数中加了一个引用的话有什么不同呢?
麻烦各位看看 谢谢!
GB b;
GA g_show = b;
GA &g_display = b;
cout << g_show.f();
cout << g_display.f();
cout << b.f();
首先引用作为函数参数,形参就是实参。
其次在语法上,基类类型可以接受子类类型的赋值。
show(b)本质上就是我代码中的g_show.f();
display(b)本质上就是我代码中的g_display.f();
当你用GB b; GA a=b;时。此时即使将GB赋值给GA了,但a还是GA,因为子类赋值给父类,只是对父类的那部分进行的赋值.非父类的那部分被"截断了"
但是当你使用GA* a = &b;或者GA& a=b;时,此时就是多态,即父类指针或父类引用指向子类对象,此时子类的虚函数表通过virtual覆盖了父类的f函数,从而调用了子类的f函数。这里你可以尝试去了解virtual的原理,包括虚函数表、虚表指针等。
此时你把父类的virtual或者你把引用去掉,输出就是1111;就没有多态了。
另外补充一下,只要父类写了virtual,子类默认不写virtual也是默认给你加了virtual的。一虚到底·