我们(应该)知道C ++标准库容器(包括std::string
)并不意味着继承。但是,C ++ 98/03确实允许我们这样做,即使它导致了错误。
既然final
关键字可用,那些标准库容器是否标记为final
以防止对它们使用继承?
如果没有,为什么会这样?
答案 0 :(得分:16)
LWG在最近于2012年2月6日至10日举行的Kona会议上讨论了这个问题。这是LWG issue 2113。
LWG决定将LWG 2113标记为NAD(不是缺陷),理由是该标准已经清楚,现有的类如容器和std::string
无法通过实现标记为最终。
讨论包括这样一个事实:尽管从这些类派生出来可能不赞成,但在C ++ 98/03中这样做显然是合法的。并且在C ++ 11中将其视为非法会破坏太多代码。
<强>更新强>
目前,current working draft中没有任何库类型标记为final
。
答案 1 :(得分:2)
std::string
似乎没有标记为final,其他容器也没有。
我猜到为什么会这样,即使从它们中推导出来也不是一般的推荐,但没有人确定如果它被禁止会破坏多少工作代码。
另请注意,对于它的价值而言,final
在技术上并不是关键词 - 它是附加了特殊含义的标识符,但仅限于特定情况。包含int final; final = 1;
之类的代码仍然可以使用。这主要是为了向后兼容 - 至少在新代码中,将final
仅用于特殊含义,而不是普通标识符几乎肯定更好。