一道c++虚函数相关问题的疑问


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的。一虚到底·