C ++非重载函数

时间:2014-07-11 21:51:03

标签: c++ overloading

我想知道是否有办法使功能不会过载。 我的想法是在类中保持私有,这样就不可能在派生类中重载函数。

但是如果在基类(持有私有函数的那个​​)中我也有一个公共或受保护的函数(让我们称之为plf)来管理私有函数(让我们称之为prf),并在派生类中创建一个与调用公共基类函数(plf)的私有基类函数(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;
}

这会返回一个没有任何冲突的x()。

非常感谢!

1 个答案:

答案 0 :(得分:1)

使用private访问权阻止重载的想法是有效的。

但是

  • 它不会阻止覆盖虚拟功能,
  • 由于C ++名称查找的工作方式,它是不必要的。

它是不必要的,因为派生类中的同名成员函数声明,阴影基类中的声明,就像在某个内部范围中声明的名称一样影响任何声明在外部范围内的那个名称。

默认情况下,派生类中没有基类名称的重载。

派生类可以使用using声明将基类定义作为重载引入,但随后它会根据程序员的意图和知识有目的地完成。这种非常明确且有意的重载是通过将基类成员函数设为私有来防止的,因为它不能在派生类中成为using的主体。但正如我所看到的,虽然防止意外重载可能有一些优点,但防止故意显式重载似乎没有意义。


为防止覆盖成员函数,您可以

  • 使用C ++ 11 final
  • 有一些私人类型的正式论点。