不可重载的函数
C++ Non overloadable function
请我想知道是否有一种方法使函数不可重载。我的想法是使它在类中保持私有,这样就不可能在派生类中重载该函数。
但是,如果在基类(持有私有函数的那个)中,我也有一个公共或受保护的函数(让我们称之为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
,或 - 有一些私有类型的正式参数。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载