如何防止超载?

3 c++

是否可以防止C++中用户定义函数的重载?假设我有一个函数:

void foo(int , int);
Run Code Online (Sandbox Code Playgroud)

我可以防止foo过载,如果是这样的话怎么样?如果可以,可以扩展以防止通过继承覆盖方法吗?

CB *_*ley 10

总之一句:不.您无法防止在foo其他位置使用其他签名定义过载,也无法阻止虚拟功能被覆盖.

在C++世界中,您必须对编写程序中编写的代码的人给予某种程度的信任.

  • Bjarne Stroustrup设计了成为C++的东西,编写了第一个C++编译器,并一直积极地开发语言.你组成自己的语言变得非常受欢迎,你可以决定什么会超载.事实上,标准中有一个运算符列表,以及一个不能重载的列表,由编译器编写者来强制执行. (2认同)
  • 我认为它内置于编译器中,试图为基本类型重载运算符自动是一个错误.内置运算符与重载运算符不同(不是函数,逻辑运算符有短路,有些运算符根本不能过载等). (2认同)

gre*_*ade 6

标准的第13.1.1至13.1.3节描述了不能重载的函数种类:

某些函数声明不能​​重载:

  • 仅在返回类型上不同的函数声明不能​​重载.
  • 如果它们中的任何一个是静态成员函数声明(9.4),则不能重载具有相同名称和相同参数类型的成员函数声明.

注意:如8.3.5中所述,具有等效参数声明的函数声明声明了相同的函数,因此不能重载:

  • 仅在使用等效typedef"types"时不同的参数声明是等效的.typedef不是单独的类型,而只是另一种类型的同义词(7.1.3).
  • 仅在指针*与数组[]之间不同的参数声明是等效的.也就是说,数组声明被调整为一个指针声明(8.3.5).只有第二个和后续的数组维度在参数类型中很重要(8.3.4).
  • 仅在那一个中​​不同的参数声明是函数类型而另一个是指向相同函数类型的指针是等效的.也就是说,调整函数类型以成为函数类型的指针(8.3.5).
  • 仅存在或不存在const和/或volatile的参数声明是等效的.也就是说,在确定声明,定义或调用哪个函数时,将忽略每个参数类型的const和volatile类型说明符.
  • 仅在默认参数上有所不同的两个参数声明是等效的.

否则,函数可能会重载,并且无法阻止它.


sbi*_*sbi 3

你不能。