为什么编译器没有在main()
中为p->f4();
行抛出错误。根据我的理解,类B
隐藏了f4()
,应该抛出错误
class A
{
public:
void f1(){}
virtual void f2(){}
virtual void f3(){}
virtual void f4(){}
};
class B : public A
{
public:
void f1(){}
void f2(){}
void f4(int x){}
};
int main()
{
A *p;
B o2;
p = &o2;
p->f1();
p->f2();
p->f3();
p->f4(); //why doesn't it throw an error for this line as class B hides f4()
p->f4(5);
return 0;
}
1条答案
按热度按时间8hhllhi21#
指针
p
的静态类型是A *
。函数
f4
在类A
的作用域中被搜索并被找到和调用。由于该函数被声明为虚拟的,则如果它将在类B
中被覆盖,则将调用类B
中的覆盖函数。但为了这通电话
编译器应该发出错误,因为在类
A
中不存在接受类型int
的参数的名称为f4
的函数。