不可重载的函数

C++ Non overloadable function

本文关键字:函数 重载      更新时间:2023-10-16

请我想知道是否有一种方法使函数不可重载。我的想法是使它在类中保持私有,这样就不可能在派生类中重载该函数。

但是,如果在基类(持有私有函数的那个)中,我也有一个公共或受保护的函数(让我们称之为plf)来管理私有函数(让我们称之为prf),并且在派生类中,我创建了一个与调用公共基类函数(plf)的私有基类函数(prf)同名的函数,我想知道是否不会有两个同名(prf)函数之间的冲突?

假设派生类的prf函数不是基类的prf函数的重载(因为最后一个prf函数不可见)。

提前感谢。

我刚刚做了以下测试:

class a
{
private:
    void x();
public:
    void y();
    a();
};
class b : public a
{
public:
    void x();
    b();
};
a::a(){}
void a::x()
{
    cout << "Write a" << endl;
}
void a::y()
{
    x();
}
b::b(){}
void b::x()
{
    y();
}
int main()
{
    b t;
    t.x();
    return 0;
}

返回a的x(),没有任何冲突。

非常感谢!

使用private访问来防止重载的想法是有效和有效的。

,

  • 它不阻止覆盖虚函数的,并且
  • 由于c++名称查找的工作方式,它是不必要的。

这是不必要的,因为在派生类中声明同名的成员函数,会遮蔽基类中的声明,就像在某些内部作用域中声明的名称会遮蔽外部作用域中该名称的任何声明一样。

默认情况下,派生类中不允许重载基类名。

派生类可以使用using声明将基类定义作为重载引入,但这样做是有目的的,具有程序员的意图和知识。这种非常显式和有意的重载是通过基类成员函数私有来防止的,因为这样它就不能在派生类中成为using的主题。但是,在我看来,虽然防止无意的重载可能有一些优点,但防止有意的显式重载似乎没有意义。


要防止重写成员函数,可以

  • 使用c++ 11 final,或
  • 有一些私有类型的正式参数。