#include <iostream>
using namespace std;
class A
{
public:
virtual void Show() const { cout << "A" << endl; }
};
class B: public A
{
public:
void Show() const { cout << "B" << endl; }
};
void Fun1(A obj) { obj.Show(); }
void Fun2(const A &obj) { obj.Show(); }
int main()
{
B b;
Fun1(b);
Fun2(b);
A *p = new B;
p->A::Show();
p->Show();
return 0;
}
输出为
A //fun1的形参为普通对象A,那两个函数在内存中的存在形式是A::show
在是b的show函数,继承过来的函数位置是考前的,并且两个函数均声明为常函数,能看见a的show和b的Show函数,但是
当通过普通对象调用常函数时,调用最近的重载函数,所以输出为A,
B// fun2的形参是常对象引用,能够调用常成员函数,并且由于已经实现了重载,也就是说只能看见b的show函数,
A //题中说明要访问A作用域里面的show
B//通过virtual已经实现重载,所以输出b的Show函数