在一次偶然的写代码过程中,遇到了这个语法点,特意记录一下
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)