当p=&b时,为何p-》foo();调用了基类中的foo函数,指针p就算是基类类型,但p分明指向派生类对象,为何还调用了基类函数
include
using namespace std;
class A
{
public:
void foo()
{
printf("1\n");
}
virtual void fun()
{
printf("2\n");
}
};
class B : public A
{
public:
void foo()
{
printf("3\n");
}
void fun()
{
printf("4\n");
}
};
int main(void)
{
A a;
B b;
A *p = &a;
p->foo();
p->fun();
p = &b;
p->foo();
p->fun();
return 0;
}
是根据指针类型确定的,问为什么这个是编译器的问题,因为C++是个类型系统。因为B类中,本身是存在二个foo,一个是A类的foo,一个是重写的foo,因为p是一个A类型的指针,肯定要类型匹配,所以先查虚表,foo不是虚函数,就不jmp到B类的foo
重载,覆盖,隐藏,这个是c++的规则。foo函数是"隐藏",fun函数就是覆盖,这个不必纠结为啥,记住就可以,因为是规则。