class Base {
public:
virtual void f();
void f(int);
virtual ~Base();
};
class Derived : public Base {
public:
void f();
};
int main()
{
Derived *ptr = new Derived;
ptr->f(1);
delete ptr;
return 0;
}
ptr-> F(1);显示以下错误:“函数调用中的参数太多。”
为什么这不可能?是不是派生继承了所有的函数形式基础并可以自由使用它们中的任何一个? 我可以明确地调用它,它会起作用,但为什么不允许这样做?
答案 0 :(得分:11)
您所看到的内容称为隐藏。
当您覆盖void f()
类中的函数Derived
时,您隐藏 f
类中Base
函数的所有其他变体
您可以使用using
关键字解决此问题:
class Derived : public Base {
public:
using Base::f; // Pull all `f` symbols from the base class into the scope of this class
void f() override; // Override the non-argument version
};
答案 1 :(得分:1)
正如@Some Programming Dude所说:这是因为隐藏。
了解隐藏在相对简单的语言
Inheritance
旨在将Base
类变量/函数带入Derived
类。
但是,在1条件下:“如果它尚未在Derived Class中可用”
由于f()
中Derived
已经可用,因此从编译器角度看Base
类是没有意义的。
这就是为什么在调用此函数时需要调整范围的确切原因
void main()
{
Derived *ptr = new Derived;
ptr->Base::f(1);
delete ptr;
}
答案 2 :(得分:0)
假设暂时Derived
可以访问函数void Base::f(int);
。然后是function overloading
的情况。但是,这是function overloading
的无效情况,因为一个函数f(int);
在Base中,而其他函数f();
在Derived中。 Function Overloading
发生在一个类中。 Function Overriding
跨类发生。您发布的示例是Name Hiding in Inheritance
答案 3 :(得分:-1)
" Derived * ptr"这个定义只允许" ptr"访问通过Derived类或其子类定义的所有成员函数。但是,由于继承,它不允许你访问Derived类中的成员函数。
如果你想访问函数的基类版本" f"然后使用" Base * ptr"它将自动选择正确的功能版本,如下所示:)
class Base {
public:
virtual void f()
{
cout<<"Here 2"<<endl;
}
void f(int x)
{
cout<<"Here 1"<<endl;
}
virtual ~Base() {}
};
class Derived : public Base {
public:
void f()
{
cout<<"Here 3"<<endl;
}
virtual ~Derived() {}
};
int main()
{
Base *ptr = new Derived;
ptr->f(1);
delete ptr;
return 0;
}
输出是 这里1