C++中的方法重载与方法隐藏

vhmi4jdf  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(106)

为什么编译器没有在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;
}
8hhllhi2

8hhllhi21#

指针p的静态类型是A *

p->f4();

函数f4在类A的作用域中被搜索并被找到和调用。由于该函数被声明为虚拟的,则如果它将在类B中被覆盖,则将调用类B中的覆盖函数。
但为了这通电话

p->f4(5);

编译器应该发出错误,因为在类A中不存在接受类型int的参数的名称为f4的函数。

相关问题