是否有可能覆盖全局实现的功能?

时间:2017-11-23 20:19:35

标签: c++

我很想知道是否可以覆盖已实现的功能。
我的意思是,是否存在允许替代实施的功能声明/实施的法律语法?

我为什么要问? (我知道这听起来很荒谬)
首先,只是好奇心和扩展我的知识 其次,我了解到全局new可以被覆盖(尽管强烈建议不要这样做) 第三,假设我写了一个库:AwsomeLibrary.hpp,其中 我的朋友想要包括。
在很多功能中,有一个像void sort(int* arr)这样的功能,他认为他可以更好地实现(当然也可以用相同的名称来实现)。

2 个答案:

答案 0 :(得分:2)

  

我的意思是,是否存在函数声明的合法语法/   允许替代实施的实现?

没有。这将打破单一定义规则(ODR)。

  

其次,我已经了解到全局new可以被覆盖(尽管如此)   强烈不推荐)。

http://en.cppreference.com/w/cpp/memory/new/operator_new中记录的

可替换分配函数实际上只是一个非常特殊的情况,是语言和标准库之间的灰色区域;当然不是你可以推断自己代码的一般规则的东西。

  

第三,假设我写了一个库:AwsomeLibrary.hpp,其中   我的朋友想要加入。在很多功能中,有一个   函数就像void sort(int * arr),他认为他可以   更好地实现(当然,使用相同的名称)。

此类问题超出了C ++的范围。它们与Git等源控制版本控制系统更相关。例如,如果您的项目受Git控制,那么您的朋友可以通过更好的实现创建代码分支。

答案 1 :(得分:2)

除了您自己提到的一种“奇怪”语言功能外,语言级别无法实现:可替换的operator newoperator delete功能。这些函数可以通过专用机制替换,这就是为什么它被正式称为 replacement (而不是覆盖重载)。语言用户无法使用此功能来执行自己的功能。

超出标准语言的限制,您可以使用弱符号等特定于实现的功能,这将允许您创建可替换的功能。例如,GNU标准C库中的几乎所有函数都被声明为弱符号,可以用用户提供的实现替换。

后者恰好可以替代库中的void sort(int* arr)函数。然而,这对于库来说看起来不是一个好的设计。功能替换功能可能应保留用于调试/日志记录以及其他内部库调整目的。