天天看点

c++隐藏

在一次偶然的写代码过程中,遇到了这个语法点,特意记录一下

class A
{
public:
    virtual void f(int) {}
    virtual void f(vector<int>&) {}
};

class B : public A
{
public:
    virtual void f(vector<int>&) override {}
};

class C
{
public:
    void f()
    {
        vector<int> vec;
        B ob;
        ob.f(vec);
        ob.A::f(1);
        //ob.f(1);  这种写法是不行的,为什么呢?
    }
};
           

以上代码中,为什么被注释掉的那行会编译不过呢?按道理来说,父类存在该函数,还是public的,参数类型也对,应该是能编过的。

没错,答案就是父类A中的f(int)在子类B中被隐藏了。

隐藏(https://blog.csdn.net/magic_world_wow/article/details/82152839):

派生类将继承的基类的同名的成员变量和成员方法隐藏起来,通过派生类只能访问到自己的成员变量和成员方法。若想要访问基类的成员变量和成员方法需加上基类的作用域。隐藏以后的直接效果就是:无论在派生类的内部或者外部(通过派生类成员)访问该成员;全都是访问派生类的同名成员; 如果在派生类内部或者外部(通过派生类成员)访问同名的成员函数,则需要根据函数调用的规则来调用派生类的同名成员函数。

因此如果要调用父类f(int)函数,就需要显示的调用:  ob.A::f(1)

继续阅读